Хочу самостоятельно проверить количество простых арифметических операций которые совершает процессор.
Сделал бесконечный цикл, который постоянно увеличивает переменную и выводит ее:
begin
i:=1;
while i<>0 do begin
label1.Caption:=inttostr(i);
end;
Ожидал увидеть увеличивающееся число в label1.
При запуске программа зависает и выводить ничего не хочет.
Почему так? И как заставить работать?
Другие языки программирования и технологии
Написал небольшой код на делфи. Почему не работает?
Application.ProcessMessages в цикле.
Только это Вам не даст того, что Вы хотите.
Вы только получите колво-обновлений окна в текущем потоке. Даже не тактов. Операций происходит несоизмеримо больше. Системные очереди, сообщения, другие приложения, драйвера - всё это требует простейших мат. операций и Вы не отследите сколько. Даже в потоке с наивысшим приоритетом. Но можно оценить примерно сколько можно "отжать" у ОС =)
P.S: Сорян - увидел ответы слегка позже =)
Только это Вам не даст того, что Вы хотите.
Вы только получите колво-обновлений окна в текущем потоке. Даже не тактов. Операций происходит несоизмеримо больше. Системные очереди, сообщения, другие приложения, драйвера - всё это требует простейших мат. операций и Вы не отследите сколько. Даже в потоке с наивысшим приоритетом. Но можно оценить примерно сколько можно "отжать" у ОС =)
P.S: Сорян - увидел ответы слегка позже =)
Такие вещи так не делаются.
Хочешь сделать какой-то benchmark - алгоритм примерно такой:
1. Назначаем своему процессу приоритет Realtime. Желательно его запустить с Affinity mask на какое-то одно ядро, чтобы винда не умничала в процессе.
2. Засекаем текущее время.
3. Выполняем определенное количество действий, а не бесконечный цикл. Действия, написанные в виде ассемблерной вставки, будут предпочтительнее - тогда ты точно будешь знать, что именно там выполнялось, а не что компилятор наваял для тебя.
4. Засекаем текущее время и сравниваем с пунктом 2.
5. Делим количество операций на разницу во времени - получаем бенч для одного ядра.
Но даже это от лукавого, поскольку виндоза - не Realtime-система, у нее свои понятия о выполнении чего угодно.
Хочешь сделать какой-то benchmark - алгоритм примерно такой:
1. Назначаем своему процессу приоритет Realtime. Желательно его запустить с Affinity mask на какое-то одно ядро, чтобы винда не умничала в процессе.
2. Засекаем текущее время.
3. Выполняем определенное количество действий, а не бесконечный цикл. Действия, написанные в виде ассемблерной вставки, будут предпочтительнее - тогда ты точно будешь знать, что именно там выполнялось, а не что компилятор наваял для тебя.
4. Засекаем текущее время и сравниваем с пунктом 2.
5. Делим количество операций на разницу во времени - получаем бенч для одного ядра.
Но даже это от лукавого, поскольку виндоза - не Realtime-система, у нее свои понятия о выполнении чего угодно.
правильно что зависает. когда ей заниматся прорисовкой, если она в цикле висит. что бы не висло - изучай потоки
мало того, что нет инкрементирования счетчика, так прога еще и тупо не успевает обработать очередь сообщений на отрисовку.
надо ещё Application.ProcessMessages в цикл подпихнуть. но это уже не будет "количество простых арифметических операций"
надо ещё Application.ProcessMessages в цикл подпихнуть. но это уже не будет "количество простых арифметических операций"
Шерзод Султанов
увеличение i есть в проге, сюда криво скопировал.
Application.ProcessMessages как это работает?
Application.ProcessMessages как это работает?
i=:i+1; в этом вся причина
в других языка или языке увеличение значит i++;
ну или i+=1;
и что это не знаю так должно быть или нет <> что это по твоему и ты уверен что правильно?
а у тебя просто inttostr(i); и еще может быть inttostr нужно большими ну именно так IntToStr
Скорее WinApi привязан жестко к регистру букв от него ко всему наверно и пошло, вроде верхний это большие буквы а нижний это маленькие. ну и привязан это если чуть не то или маленькая или большая и все не работает.
например у меня в программе недавно While не работало, написал while заработало.
ну или i+=1;
и что это не знаю так должно быть или нет <> что это по твоему и ты уверен что правильно?
а у тебя просто inttostr(i); и еще может быть inttostr нужно большими ну именно так IntToStr
Скорее WinApi привязан жестко к регистру букв от него ко всему наверно и пошло, вроде верхний это большие буквы а нижний это маленькие. ну и привязан это если чуть не то или маленькая или большая и все не работает.
например у меня в программе недавно While не работало, написал while заработало.
Похожие вопросы
- очень небольшая прога на с++, почему не работает??
- Какой язык даст большее быстродействие готового кода С++,Делфи, Ассемлер, в таком куске кода (внутри)?
- Помогите упростить код на делфи.
- простейший код в Делфи: проверка строки на корректность символов
- Написал небольшую программу, не могу понять почему не работает цикл while и оператор else
- Почему не работает моя делфи-программа которая при прокрутке колесика мышки должна была менять число в эдите?
- [C++] Сравнение векторов. Почему-то работает криво, хотя код простой. Где ошибка?..
- Почему не работает код?
- Необходимо написать кусок кода, который формирует новый массив из исходного.
- Написала небольшую програмку, но в ней что-то не так, проверьте
Отдельный поток для вычислений и отрисовки оказался решением.