<bgdev />free

| |  


All tags 2023 9may ai algorithm alpha amd american api argon2 arm asm asmbb assembler attachment awareness balgaria bay888 bcrypt bender beta bgdev-next bgdev-next.👍 big.data bitchnigga bitcoin bmw boi borg brexit bug bulgaria business c cad chat cloud computer-names console crossorigin deprivation desktop dna dotnet email eupl falling feature forum foundation fp fresh fun game github goats google gpl gpt gpt.3.5 gypsies happiness harvard hash improvement include investment it java javascript js kleta kleta.maqka.balg lambi language learning leftovers legend level levenshtein.dist libx license linkedlist linux ma mcafee mele microsoft minimag minimalism negro net nginx nigga not.a.bug oop paradigm parler patterns perception persuasion pipe play.station politics populi pornhub pow pro programming protonmail python reba rust sci-fi scripting seks seo server shell sleep smartbeauty soft-skills sqlite srabska sse starship sugerface syntax tablet tailwindcss telegram theme thug troll80lvl tutanota typescript uacme ui uk unix untermensch upload uptime usa utilities ux vb via viber virtual.reality vox vps vulnerable war wasm weapons-grade web windows word x86 xbox xss youtube zig ziglang Übermensch БОКЕБЪЛГАРИН БЪ БЪлгария Белезниците Били Били.Белезниците БялДонор Веган Виста Възраждане ГЛУПАК Гана Глиста ЕС Казарма Копейкин Мода.и.овча.мисъ НЕКАДЪРНИК НРБ ПО-ЗЛЕ.И.ОТ.РАБИ Подкасти Разни Румен СИК СКУМ СетенЧук Скум ТИР Туче Украйна Урсула Яначков авангард аз айфонджия алгоритми амбиции анархизъм антиваксъри армения аудио аутисти бази.данни бакъп без без.пръчове безпросвета бенчмарк биготи биомаса бира боклук борисов ботев брадва булшит бъг бъгове бял ваксина вандал век венерика викинги вицове вишу война вървежен гана ганорник гей гейщина германия герои гешев глупак говеда групировка гюбек данъкоплатец двойни.стандарти дедотия демокрация дизайн дисциплина добитък докери долар донори држава дришльо дрон ебане еврогейски.съюз езици експеримент електроника електроника.s2 емиграция ендпойнт енум ерген ергономия жалкар задача затоплизъм защита здраве златен злато игри идеали идиократ идиократи идиокрация идиот избори избори.рабин изкуство икономика имбецили имейл инвестиране инокулация инструмента интервю ипад искам.да.си.реда казах камшикодържач капитализъм карабах караница картечница кино клавиатура ковид19 колайдер колям.кур комари комплексар комунизъм консолидация конспирации космонавтика кофа кофит-19 краставица криптовалути курви кучелюбци лайно лаладжия лаптоп либерастия литература лоши.практики луд лъжеучени лъжец любов майни майтапи малоумници мафия мениджмънт месо местене метавселена метафизика механика мистика мисъл мода мода.овча.мисъл модерация морал мутра мутри наука национализъм не.it негър некадърник некадърници неон нидерландия овча овчи олигофрени организация офтопик парички партия педал пенджури пенсия пишока плюскане победа погромист поезия политика порно посредствен почивка празници прасе превод предалщина програмиране проект проста простотии против.правилата проф пръч пръч.дришльо пръчка психика психични.болести психология пустиняк путин путката путьо рабин рабин.е.шибан.пе работа радост разврат разни разработка расизъм резерват рейтинг реклама рекламен религия рест ризи ропче ропчета русия руски.език рутина самоковска сасипаха секира село селяндур сериали сериозно.програм сетен сеянин симулация скопяване скръм слушалки сортиране софия софтуер софтуни социализъм спектрометър спринтове сране стандарти стил стуйо стюи сушилня сцена съвет съм сън сървър сърничка таб ташаци телевизия тема територията терминология термояд технологии титли традиция тролинг тръмп туба туче тъпак тъпанари тъпня уиндоус украйна умнокрасивци фалит фантастика фашизъм фейк.акаунти физика филми форум форумни.проекти футбол хазарт хамали харабия хардуер хахаха хомофобия хостинг храна хумор цайко цайси целофан цензура цензурра циганин чалга чалгар чекии чернокраки честота чипове чнг чужбина чук шпация щайга юан яката яко ям 🔨 😂 🪓


Защо така ?

  

0 1 2


  ФейкПрофил  Създадено на 12.12.2020, видяно: 1936 пъти. #21539

Забелязах много интересен феномен,който не мога да си го обясня:

Вариант 1:


fn solve_part_one_1(input: &mut [i32]) -> Option<i32> {
    input.sort_unstable();

    let mut ones = 0;
    let mut threes = 1; 
    let mut prev = 0;

    for &i in input.iter() {
        let diff = i - prev;
        if diff == 1 {
            ones += 1;
        } else if diff == 3 {
            threes += 1;
        }

        prev = i;
    }

    if cfg!(debug_assertions) {
        println!("O:{}; T: {}; Result: {}", ones, threes, ones * threes);
    }

    Some(ones * threes)
}

Вариант 2:


fn solve_part_one_2(input: &mut [i32]) -> Option<i32> {
    input.sort_unstable();

    let mut sums = [0, 0, 1];
    let mut prev = 0;

    for &i in input.iter() {
        let diff = (i - prev) as usize;
        if diff <= 3 {
            sums[diff-1] += 1;
            prev = i;
        }
    }

    if cfg!(debug_assertions) {
        println!("O:{}; T: {}; Result: {}", sums[0], sums[2], sums[0] * sums[2]);
    }

    Some(sums[0] * sums[2])
}

Та това което не мога да си обясня е, защо вариант 1 се изпълнява за 2800 наносекунди, а вариант 2 - само за 1500. Защо така ?

Attached files:
FileSizeUploadedDownloadsMD5 hash
input.txt342 bytes12.12.202014894eb30170b55fe60a1d1fe872f7d160c


  saruman  Последно редактирано на 13.12.2020 от saruman, видяно: 1914 пъти. #21575

Компилатора на Ръст е смотан? :-)



  |  Създадено на 13.12.2020, видяно: 1899 пъти. #21577

По-малко сравнения? По-малък шанс за branch misprediction?

П.П. Двете програми не са еквивалентни.



  saruman  Последно редактирано на 13.12.2020 от saruman, видяно: 1892 пъти. #21578
|

По-малко сравнения? По-малък шанс за branch misprediction?

П.П. Двете програми не са еквивалентни.

Аз на пръв поглед без да бенчмарквам бих предположил,че трябва да са точно обратните резултати,а именно там където се ползва [] оператора да е по-бавно,въпреки,че паметта е алокирана на едно място



  |  Създадено на 13.12.2020, видяно: 1877 пъти. #21579
saruman
|

По-малко сравнения? По-малък шанс за branch misprediction?

П.П. Двете програми не са еквивалентни.

Аз на пръв поглед без да бенчмарквам бих предположил,че трябва да са точно обратните резултати,а именно там където се ползва [] оператора да е по-бавно,въпреки,че паметта е алокирана на едно място

Това всъщност показва, че компилатора на Ръст е доста добър.



  saruman  Създадено на 13.12.2020, видяно: 1869 пъти. #21580
|
saruman
|

По-малко сравнения? По-малък шанс за branch misprediction?

П.П. Двете програми не са еквивалентни.

Аз на пръв поглед без да бенчмарквам бих предположил,че трябва да са точно обратните резултати,а именно там където се ползва [] оператора да е по-бавно,въпреки,че паметта е алокирана на едно място

Това всъщност показва, че компилатора на Ръст е доста добър.

Стига ве,и само заради branch prediction-а ли да прави такива разлики,забележи че долу ползва даже <= оператор,ако ползва само < още би трябвало да падне времето



  |  Създадено на 13.12.2020, видяно: 1861 пъти. #21581
saruman
|
saruman
|

По-малко сравнения? По-малък шанс за branch misprediction?

П.П. Двете програми не са еквивалентни.

Аз на пръв поглед без да бенчмарквам бих предположил,че трябва да са точно обратните резултати,а именно там където се ползва [] оператора да е по-бавно,въпреки,че паметта е алокирана на едно място

Това всъщност показва, че компилатора на Ръст е доста добър.

Стига ве,и само заради branch prediction-а ли да прави такива разлики,забележи че долу ползва даже <= оператор,ако ползва само < още би трябвало да падне времето

Какво значение има дали ще е <= или <?



  saruman  Създадено на 13.12.2020, видяно: 1859 пъти. #21582

Е как какво,първото ти прави < и след това ==,това са две операции,а второто само <



  |  Създадено на 13.12.2020, видяно: 1855 пъти. #21583
saruman

Е как какво,първото ти прави < и след това ==,това са две операции,а второто само <

Струва ми се, че Иванушка Пъдаря ще ти се кара, че не знаеш асемблерските инструкции. :)



  saruman  Последно редактирано на 13.12.2020 от saruman, видяно: 1850 пъти. #21584
|
saruman

Е как какво,първото ти прави < и след това ==,това са две операции,а второто само <

Струва ми се, че Иванушка Пъдаря ще ти се кара, че не знаеш асемблерските инструкции. :)

Мълча позорно,признавам

https://stackoverflow.com/questions/12135518/is-faster-than

По-важното е,че ако я нямаше тая тема,щях да си продължавам да си живея в заблуда,че едното е по-бързо от другото :(



  Дон Реба  Създадено на 13.12.2020, видяно: 1843 пъти. #21586
saruman

Стига ве,и само заради branch prediction-а ли да прави такива разлики,забележи че долу ползва даже <= оператор,ако ползва само < още би трябвало да падне времето

да, само заради него е. обаче и на правец 16 дето няма конвеери мисля че "аритметичния" вариант ще е по-бърз, но няма да е с толкова много. ифа дори на платформа без конвеери монвеери е няколко операции и замяната му с аритметична операция (индексиране) още от фортранските времена си е била далавера. компилаторите от много отдавна като компилират switch гледат дали клоновете са последователни числа, и ако да компилират аритметично, без ифове.



  |  Последно редактирано на 13.12.2020 от |, видяно: 1836 пъти. #21590

На мен това diff-1 изобщо не ми харесва помеже може да доведе до array under/overflow. Ако разбирач правилно, че usize e unsigned, аз бих го написал като ... mut prev = 1 извън цикъла, и в цикъла prev = i + 1, индекса diff

П.П. всъщност най-добре е просто масива да се направи с 4 елемента.



  Дон Реба  Създадено на 13.12.2020, видяно: 1833 пъти. #21591
|

На мен това diff-1 изобщо не ми харесва помеже може да доведе до array under/overflow.

ами не може, ако можеше ръста няма да го компилира. и да, точно защото е без знак, ако е негативно ще стане просто голямо число.



  |  Създадено на 13.12.2020, видяно: 1831 пъти. #21592
Дон Реба
|

На мен това diff-1 изобщо не ми харесва помеже може да доведе до array under/overflow.

ами не може, ако можеше ръста няма да го компилира. и да, точно защото е без знак, ако е негативно ще стане просто голямо число.

затова съм написал under/overflow.



  Дон Реба  Създадено на 13.12.2020, видяно: 1829 пъти. #21593

деа, май си прав, какво става при нула? защо ръста го позволява?



  Courvoisier  Създадено на 13.12.2020, видяно: 1808 пъти. #21601

Пусни един С декомпилатор. Защото Branchless Programming: Why "If" is Sloowww... and what we can do about it!



  |  Създадено на 13.12.2020, видяно: 1789 пъти. #21614
Дон Реба

деа, май си прав, какво става при нула? защо ръста го позволява?

Нямам идея, не трябва ли да го позволява?



  Дон Реба  Създадено на 13.12.2020, видяно: 1773 пъти. #21631

не трябва, идеята е че ръста по време на компилация трябва да го види като грешка, но не го вижда, а и програмата не гърми, така че нещо недоглеждам



  |  Последно редактирано на 13.12.2020 от |, видяно: 1771 пъти. #21632
Дон Реба

не трябва, идеята е че ръста по време на компилация трябва да го види като грешка, но не го вижда, а и програмата не гърми, така че нещо недоглеждам

Хмм, толкова ли му е добър статичния анализ? Чувал съм, че Ръст се опитва да осигури някаква коректност at compile time, но е ясно и че не всичко може да се направи тогава.

Това означава ли, че всеки достъп до елемент на масив трябва да е guard-нат от екплицитна проверка дали индекса е в размерите на масива?



  ФейкПрофил  Създадено на 13.12.2020, видяно: 1760 пъти. #21636

Масивите имат bound checks. Ако индекса е извън границите на масива ще се паникьоса и умре в рънтайм. Обаче ако LLVM се усети, че индекса винаги ще е в границата на масива, то тогава ще махне bounds check-a като dead code.

Отделно debug билдовете се инструментират от компилатора с проверки за over/under flow. Което ти позволява да хванеш разни тъпи грешки. Обаче в release mode ги няма тези проверки, защото доста забавят.


0 1 2


Защо така ?

  



AsmBB v3.0 (check-in: 7544654b24928b93); SQLite v3.47.0 (check-in: 03a9703e27c44437);
©2016..2024 John Found; Licensed under EUPL; Powered by Assembly language Created with Fresh IDE