Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
1

Скорость обработки циклов

14.06.2017, 10:39. Показов 402. Ответов 13
Метки нет (Все метки)

Подскажите пожалуйста какой способ организации проверки работает быстрее
Delphi
1
if ((x[i]>0) and (y[i]>0) and ....)  then
....
или
Delphi
1
2
if  x[i]>0  then
   if  y[i]>0  then
....
с учётом того, что в любом случае проверяются все элементы массивов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2017, 10:39
Ответы с готовыми решениями:

Скорость обработки
Добрый вечер. Столкнулся с такой проблемой, работаю с большим двумерным массивом байтового типа, то...

ListView и картинки: увеличить скорость обработки
Всем привет. Заполняю listview картинками, читаю их с винта, уменьшаю и в imagelist. А вопрос в...

Команды обработки строк данных и организации циклов
Дана последовательность из девяти символов(байтов),размещенных в сегменте данных,начиная с адреса...

Решение задач с использованием массивов и циклов для их обработки
Решение задач с использованием массивов и циклов для их обработки. Создать соответствующий массив,...

__________________
13
Модератор
6791 / 4380 / 1874
Регистрация: 21.01.2014
Сообщений: 18,552
Записей в блоге: 3
14.06.2017, 11:10 2
Даже если у одного из способов какое-то преимущество и есть, то Вы этого не заметите, если у Вас массив не из миллиарда элементов
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
14.06.2017, 11:30  [ТС] 3
Цитата Сообщение от D1973 Посмотреть сообщение
миллиарда элементов
приблизительно такой и есть
0
174 / 161 / 71
Регистрация: 22.02.2013
Сообщений: 1,770
Записей в блоге: 2
14.06.2017, 11:33 4
yurpos, предлагаю вам самому проверить
Delphi
1
2
3
4
5
6
7
uses Windows;
 
var t : i:LongInt;
begin
t := gettickcount;
// do something
t := t - gettickcount;
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
14.06.2017, 11:52  [ТС] 5
Цитата Сообщение от NotBeginner Посмотреть сообщение
предлагаю вам самому проверить
это что.... ответ на вопрос?

Добавлено через 6 минут
мне почему то кажется, что ответ будет знать человек хорошо знающий машинный код? или хотя бы assembler?
0
224 / 79 / 35
Регистрация: 01.04.2017
Сообщений: 182
14.06.2017, 11:57 6
OMG
Зачем такие сложности, можно проверить легко и не принужденно.
Отладчик!!! Для кода
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  x, y: Array [0 .. 1000] of integer;
  i: integer;
begin
  for i := 0 to 1000 do
    if ((x[i] > 0) and (y[i] > 0)) then
      x[i] := 0;
 
  for i := 0 to 1000 do
    if (x[i] > 0) then
      if (y[i] > 0) then
        x[i] := 0;
end;
Компилируются одинаковые опкоды (ну... за исключением смещений).
0
Миниатюры
Скорость обработки циклов  
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
14.06.2017, 12:41  [ТС] 7
Цитата Сообщение от Animalia Посмотреть сообщение
за исключением смещений
спасибо за ответ с фактами)
если я правильно понял, во втором случае скорость всё же меньше на это смещение?

Добавлено через 26 минут
т.е. % на 25_30?
0
224 / 79 / 35
Регистрация: 01.04.2017
Сообщений: 182
14.06.2017, 12:42 8
Не-е-е-е. Смещение в коде это как у вас в редакторе номер строчки.
Это грубо говоря "место" куда должна перепрышнуть программа если условие в if не выполнилось.

Разберем один из цветных блоков со скрина выше


Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
Unit1.pas.114: if ((x[i] > 0) and (y[i] > 0)) then
005CD5D7 8B45F8           mov eax,[ebp-$08]    - поместили в eax значение [B]i[/B]
005CD5DA 83BC8550F0FFFF00 cmp dword ptr [ebp+eax*4-$0fb0],$00 - сравнили значение x[i] с 0
005CD5E2 7E19             jle $005cd5fd    - если не равно пропускаем до строки [I]005CD5FD[/I]
005CD5E4 8B45F8           mov eax,[ebp-$08]    - опять поместили в eax значение [B]i[/B] (по идее это место можно оптимизировать)
005CD5E7 83BC85ACE0FFFF00 cmp dword ptr [ebp+eax*4-$1f54],$00 - сравнили значение y[i] с 0
005CD5EF 7E0C             jle $005cd5fd    - если не равно опять пропускаем до строки [I]005CD5FD[/I]
005CD5F1 8B45F8           mov eax,[ebp-$08]    - опять поместили в eax значение [B]i[/B] (да, вот такие мы [S]упоротые[/S] упорные)
005CD5F4 33D2             xor edx,edx    - очистили [B]edx[/B]
005CD5F6 89948550F0FFFF   mov [ebp+eax*4-$0fb0],edx - запихнули в x[i] 0
005CD5FD FF45F8           inc dword ptr [ebp-$08]    - увеличили [B]i[/B] на 1
005CD600 817DF8E9030000   cmp [ebp-$08],$000003e9     - сравнили с 1001
005CD607 75CE             jnz $005cd5d7    - если не равно шуруем в начало цикла
Так вот эти $005cd5fd и есть смещение (ну вообще адрес, его нам показали для наглядности, в строке 005CD5E2 7E19 jle $005cd5fd для примера написано прыгнуть на 25 байт вперед)

Скорость работы обоих циклов (из моего примера по крайней мере) абсолютно одинакова (разве данные из памяти в кеш процессора попадут)
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
14.06.2017, 13:08  [ТС] 9
"Это место можно оптимизировать" - что вы имели ввиду?
попытаюсь объяснить зачем мне это нужно, есть 8 массивов по 1 Мбайту (о большем просто не мечтаю), с учётом что i7-4770 3,4GHz 32ГБ при обращении к этим элементам массива (последовательно) и такого как пример примитивного сравнения в одном цикле раз 8 ....я просто сижу и жду когда появится результат, а результат хотелось бы получать раз 10 в секунду, вот и стоит задача как оптимизировать программу (может начать изучать машинные коды?)... и какой прирост в скорости мне это даст? какой то %?...или в разы?

Добавлено через 59 секунд
Цитата Сообщение от Animalia Посмотреть сообщение
абсолютно одинакова
вы уверены?
0
2103 / 1251 / 442
Регистрация: 29.05.2013
Сообщений: 5,620
14.06.2017, 13:27 10
Я вижу 3 варианта.
1. Переход на Фортран который ориентирован на расчеты
2. Использование специализированных сторонних библиотек математических расчетов.
3. Переписать код на использование графического процессора
0
224 / 79 / 35
Регистрация: 01.04.2017
Сообщений: 182
14.06.2017, 13:42 11
Для моего примера - да, уверен.
Если много обращений попробуйте оптимизировать введением локальной переменной.
В начале цикла прочитали из массива и работаете с локальным значением, а в конце цикла, наоборот, записываете в массив новое значение.
Но это если много математики в теле цикла. Если тело короткое, то компилятор и сам не плохо оптимизировать умеет.

"Это место" - это слегка не оптимальный код компилятора. Мелочь которая иногда режет глаз

Вы бы сразу код с которым возникли затруднения писали.

Asm вещь хорошая, но нужен он раз в пол года, и код "вылизывать" приходится.
Но для общего развития и чтоб понимать что при отладке творится это необходимо.
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
14.06.2017, 14:04  [ТС] 12
Цитата Сообщение от Пытливый Посмотреть сообщение
Переход на Фортран который ориентирован на расчеты
Пробовал один и тот же кусок программы (например создать логический файл размером в 1 ГБ , заполнить каким нибудь числом, сравнить каждый элемент с последним и вывести последний), так вот на фортране время почему то в 2 раза дольше, хотя и сам был уверен в обратном
Цитата Сообщение от Пытливый Посмотреть сообщение
Переписать код на использование графического процессора
с этим я не знаком, может вкратце что это такое?

Добавлено через 1 минуту
Цитата Сообщение от Animalia Посмотреть сообщение
попробуйте оптимизировать введением локальной переменной
именно так всё и применено)
а можно каким либо способом распараллелить проверку разных файлов? иными словами задействовать все 4 ядра, а не 1 как сейчас (или для расчётов вообще лучше использовать одноядерный (или 2х ядерный))
0
224 / 79 / 35
Регистрация: 01.04.2017
Сообщений: 182
14.06.2017, 14:05 13
Фортран УДОБЕН для математики, но удобен <> быстр.
Дубль два: код в студию
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 14
14.06.2017, 14:13  [ТС] 14
Цитата Сообщение от Animalia Посмотреть сообщение
код в студию
к сожалению юридические препоны даже часть кода не позволяют выложить, боюсь придётся менять профессию на менее интеллектуальную
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2017, 14:13

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Составить программу для обработки многомерных массивов с использованием циклов.
Составить программу для обработки многомерных массивов с использованием циклов: Дана...

скорость обработки
Господа програмисты делаю программу и встал такой вопрос-допустим у нас есть такой код int a;...

Скорость обработки данных
Добрый день, всем. Прошу оказать помощь в вопросе оптимальной обработки данных в циклах....

Скорость обработки данных
Подскажите пожалуйста что можно использовать для высокой скорости обработки данных, акцесс меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.