
BG Development · За реклама · За контакти |
![]() ![]() ![]() ![]() ![]() |
Здравей! ( Включване | Регистриране ) |
![]() ![]() ![]() |
FidelDahan |
Публикувано на: 28-12-2021, 16:37
|
||||||||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 2429 Регистриран на: 12.06.08 ![]() |
Хей хо :-) започнах да уча Rust и се опитвам да направя функция която приема стринг и го хешира многократно чрез SHA-1. Ползвам struct Sha1 от библиотеката rust-crypto който имплементира trait Digest: main.rs:
Може ли hash_repeatedly() да се пренапише по по-ефективен начин, така че да не се получава излишно алоциране на памет? Примерно това в момента се случва 1000 пъти вътре във sha1(): let mut hasher: Sha1 = Sha1::new(); Опитах да го пренапиша използвайки функции в Sha1, които раотят с байтове вместо стрингове и reset()-ване на Sha1 за всеки междинен хеш вместо алоциране на нов Sha1:
Но дава грешка когато се опитам да го превърна накрая байтовете обратно в стринг:
Искам максимално да го оптимирам, защото после в експеримента тази функция ще се изпълнява за милиарди входни данни. Някакви идеи? ПП: в случай че някой иска да го пробва, това е cargo.toml:
|
||||||||
FidelDahan |
Публикувано на: 28-12-2021, 18:32
|
||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 2429 Регистриран на: 12.06.08 ![]() |
Открих грешките, явно байтовете трябва се преобразуват допълнително като шестнадесеттичен стринг. И буфера е 20 вместо 40 байта (160 бита за изхода на SHA-1).
Обаче резултата е че "оптимизираната" ми функция върви 5% по-бавно ![]() |
||
Bender++ |
Публикувано на: 28-12-2021, 22:36
|
||||||||||
![]() Име: Група: Потребител Ранг: Редовен член Мнения: 359 Регистриран на: 18.04.21 ![]() |
Най-накрая още някой да подхване ръст ![]() Проблема ти е, че
алокира памет. А пък
валидира байтаррея и пак алокира нов стринг. С минимална промяна могат да се избегнат 2те излишни алокации и валидацията и става по-бързо:
Benchmark:
Results:
Това мнение е било редактирано от Bender++ на 28-12-2021, 22:41 -------------------- Ваксините са лъжа и НЕ работят! Не на ковид фашизма!
Слава на Цар Путин! Долу украинските фашисти! Слава на героите - Z V |
||||||||||
FidelDahan |
Публикувано на: 29-12-2021, 15:15
|
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 2429 Регистриран на: 12.06.08 ![]() |
Благодаря много Bender
![]() ![]() |
SuN |
Публикувано на: 29-12-2021, 23:41
|
![]() Име: Група: Администратор Ранг: Почетен член Мнения: 12323 Регистриран на: 27.01.05 ![]() |
Ако от името на функцията не става ясно, че прави мизерии зад гърба ти, то или използваш грешната абстракция (езика в случая) или решаваш грешния проблем.
И понеже съм минал примерите от официалната книжка, чувствам се достатъчно уверен да изкажа това мнение. Това мнение е било редактирано от SuN на 29-12-2021, 23:42 -------------------- Само аз не троля.
Всички коментари са плод на художествена измислица и нямат общо с действителни и недействителни лица, събития и факти. |
Bender++ |
Публикувано на: 30-12-2021, 19:46
|
||
![]() Име: Група: Потребител Ранг: Редовен член Мнения: 359 Регистриран на: 18.04.21 ![]() |
Е то е очевидно какво прави - щом връща owned обект, в случая String, то няма как да не алокира памет -------------------- Ваксините са лъжа и НЕ работят! Не на ковид фашизма!
Слава на Цар Путин! Долу украинските фашисти! Слава на героите - Z V |
||
SuN |
Публикувано на: 31-12-2021, 00:31
|
![]() Име: Група: Администратор Ранг: Почетен член Мнения: 12323 Регистриран на: 27.01.05 ![]() |
Дали е очевидно може да се спори. На пръв поглед този съкратен запис на няколко операции напомня много на джаваскрипт, само че компилиран. Даже неефикасно заделя памет. Липсва само един колекционер на боклуци.
![]() Това мнение е било редактирано от SuN на 31-12-2021, 00:32 -------------------- Само аз не троля.
Всички коментари са плод на художествена измислица и нямат общо с действителни и недействителни лица, събития и факти. |
![]() |
![]() ![]() ![]() |