Код (Text): function StrLen(tStr:PChar):integer; asm PUSH EBX MOV EDX,EAX @L1: MOV EBX,[EAX] ADD EAX,4 LEA ECX,[EBX-$01010101] NOT EBX AND ECX,EBX AND ECX,$80808080 JZ @L1 TEST ECX,$00008080 JZ @L2 SHL ECX,16 SUB EAX,2 @L2: SHL ECX,9 SBB EAX,EDX POP EBX end; Код (Pascal): function StrLen(tStr: PChar): integer; begin result := 0; while tStr[result] <> #0 do if tStr[result + 1] <> #0 then if tStr[result + 2] <> #0 then if tStr[result + 3] <> #0 then inc(result, 4) else begin inc(result, 3); exit; end else begin inc(result, 2); exit; end else begin inc(result); exit; end; end; Разницы в скорости почти нет
Tech, Братишка а ты знаешь что этот человек f13 протекторов порешал больше, чем ты прожил ? Этот форум, люди было есчо когда ты в детский сад ходил и не тебе правила задавать.
Tech, Ты не понимаешь, этот скрипт убожество", сорян за термин, другой не применим: После сборки это превратится в билд чепухи. И это только длину строки узнать. > А что наработано то? Мы знаем архитектуру, сам я создал инструменты анализа, методы(картирование, наследование), работы по виртам, виксам. А вы сюда пришли с галимым паскалем без понятия даже что такое визор или профайлер. Не зная истории форума. Благодаря мне ты можешь редактировать свои сообщения.
Tech, Судя по скрипту, алго, ты умственно отсталый либо же школьник. Про select:case не слышал? А еще есть осевые интерфейсы для таких примитивов. Предлагаю таких сразу в бан.
Ahimov, Это мой копипаст из сети, просто замерил скорость выполнения на делфи и на асме, никакой разницы не заметил по скорости. Вернее разница есть, но она не существенна.
schuler, А должна быть разница в профайле, про шедулер слыхал что такое поточное квантование ? Что за школосходка!?
Ahimov, В Delphi 7 нет встроенного профайлера, замерял через GetTickCount, а надо было через QueryPerformanceCounter ? Какое поточное квантование? с школьным уровнем 9го класса, конечно не слышал. Просто ковырялся в старье начала 2000х годов и нарвался на этот код
schuler, Понятно, сразу бы сказал. Замер профайла бывает двух видов. Первый реализован архитектурно - взводится высокопр. таймер, он вызывает прерывания. Процедура обработки берет адрес останова потока и матем. индексирует счетчик в адресном массиве. Так мы видим где задача, тоесть поток провел больше времени. Мы это называем - обеспечить покрытие кода(cover). Второй тип - замер в цикле. Но тут нужно понимать что есть задача, поток и это дискретно. Система дает квант времени, затем забирает примерно 20ms задача исполняется, затем уходит в сон. Замер в цикле ты увидешь поточное квантование и и расчет производительности будет неверен, матем ошибка без учета планирования. Простой пример - есть решения, это конструкторы, с виксов. Ты на вход даешь код, он формирует граф и пересобирает код назад, обычно мутация еще, но не суть. Так для оптимизации сборки необходим механизм BDO, тут есть моя тема и я нашел решение. Но не суть - использовался примитивный механизм, уменьшаем ветвление и ребилдим весь граф. Был использован профайлер, который показал этот косяк. Наверно много написал, сорян за опечатки я с сенсора
Ты сделал мой день. У индия к сожалению перья не держатся, приходится постоянно втыкать по делу и без.
Если хотите измерить время выполнения блока кода, просто создайте для этого благоприятную среду. Тогда и планировщик может не отобрать 30 мл/сек квант вашего потока. Шедулер передаёт управление только активным потокам в очереди, которые реально исполняются на данный момент. Если у вас открыто хоть 100 окон с разными приложениями, но все они находятся в фоне, планировщик не переключится ни на один из них, а будет постоянно отдавать квант только вашему профайлеру, окно которого висит на переднем плане. Но если в момент тестов у вас параллельно идёт, например, длительное копирование данных, тогда система отберёт ваш квант, и на такое-же время передаст его потоку копирования, после чего опять вернёт его вам. В общем случае нужно: 1. Включить в биосе таймер HPET, чтобы получить от QueryPerfFreq() макс частоту 14 МГц. 2. Закрыть все остальные приложения 3. При помощи SetProcessAffinityMask(-1,1) оставить только 1 ядро ЦП 4. Установить высокий приоритет своему потоку через SetPriorityClass(-1,HIGH_PRIORITY_CLASS), тогда у вас точно не отберут квант. 5. Перед каждым замером очищать конвейер ЦП, например инструкцией lfence или cpuid. 6. Иметь ввиду, что профилирование кода любыми методами не даёт 100% результата - всегда имеется погрешность. Вот небольшое приложение на fasm'e, которое измеряет длительность инструкций rdtsc, lfence, и api Sleep(500). Каждый тест производится не 1, а 5 раз подряд, после чего нужно выбрать наибольшее значение. Код показывает и частоту счётчика QPC - если она меньше 10 Мгц, значит HPET в системе не работает, и нужно включить его через bcd.
Вместо сбора секций можно было LTO обойтись, не? (-flto) Ну и говоря о еще меньшем размере, Цэ/Плюсы то будет попроще без стандартных библиотек собрать, чем Паскали.
Tech, Размеры двух яп нельзя сравнить, так си использует импорт системных длл. Например для печати дробных чисел вызывается процедура из ртл, в нэйтив нет возможности печати математики(printf() не полноценна). В паскале это возможно билдится сразу, сравнение не корректно. На счет мин размера есть тема, там выполнен анализ загрузчика. дипсик сломали, из за перегрузки серверов выключили доступ в сети и файлы
Tech, Попробуй распечатать 1/3, поймешь о чем я. Может на счет билда не точно, я не знаю как у дельфи. Можешь проверить. Системная ntdll.Xprintf не поддерживает /e, f
Tech, Так ты делаешь чепуху, не рассматривая содержимое файлов, сравниваешь размер. Может там вообще область без ничего в 20кб. Сишное приложение завязано на системные длл, соотв. оно в любом случае меньше размером, тк часть кода уже встроена в систему. Открывай дизом и смотри содержимое. > Просто перепиши это: Это не работает на андроиде, параметры описаны в спецификации. Если лень читать, спроси у бота. Мне за тебя это делать не интересно.
Минимальный размер хеллоу ворлда будет 4кб без объединения секций. --- Сообщение объединено, 13 июн 2026 --- Код (C): #include <windows.h> void EntryPoint() { MessageBoxA(NULL, "Hello World", "Hello World", MB_OK); ExitProcess(0); } Код (Text): x86_64-w64-mingw32-gcc -o ./test.exe -O3 -Os -flto -nostdlib -s ./test.c -eEntryPoint -lkernel32 -luser32 wine ./test.exe Код (Text): > ls -l -rw-r--r-- 1 user user 124 июн 13 15:26 test.c -rwxr-xr-x 1 user user 3584 июн 13 15:31 test.exe -rw-r--r-- 1 user user 101 июн 13 15:30 test.sh
Tech, Сказки дядюшки Римуса о x64 → Глава третья. Как Братец Кролик уменьшал размер программы MessageBox 2560 байт → 298 байт