Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

Какое сложение двух пар чисел быстрее?   Найти похожие ветки 

 
Barloggg   (2005-08-31 13:54) [0]

Предположим имею две пары чисел Word.
Хочу сложить.

Что быстрее
var a,b,c,d,sum1,sum2:word;
...
sum1:=a+b;
sum2:=c+d;

или так:
type tn=record
  case integer of
     0: (a,b:word);
     1: (n:longword);
  end;
end;
var ab,cd,sum:tn;
var sum1,sum2:word;
...
sum.n:=ab.n+cd.n;
sum1:=ab.a;
sum2:=ab.b;


 
DimaBr   (2005-08-31 13:58) [1]

А смыс-то при нынешних технологиях.
Пишем цикл на пару лимонов операций и засекаем таймером.


 
Digitman ©   (2005-08-31 14:06) [2]


> Barloggg   (31.08.05 13:54)  


что-то огород с записью непонятен ..

поясни, что ты имел ввиду при этом ...


 
Barloggg   (2005-08-31 14:08) [3]

два раза складывать по одному два ворда или один раз складывать два лонгворда с преобразованием типов вот в чем вопрос.
Оба кода рабочие. Оба выдают одинаковый результат. Что быстрее? Или может правильнее спросить что элегантнее?


 
Digitman ©   (2005-08-31 14:16) [4]


> Оба кода рабочие


хм...

sum.n:=ab.n+cd.n; //здесь ты сложил два лонгворда, результат сложения поместил в третий логгворд

sum1:=ab.a; //а сумму почему-то читаешь из первого слагаемого, а не из результата, который ты записал в sum
sum2:=ab.b; //и здесь тоже к sum не обращаешься

?


 
tesseract ©   (2005-08-31 14:16) [5]

Давайте подумаем какой у на процессор - 32бита, и АЛУ, и регистры у него такие-же.  Т.Е процессору  всё равно cardinal(longword) или byte. Для него все числа одинаковые - 32 бита.
Процессор захряпывает данные из кэша тоже по 32 бита, т.е. Если есть два числа по 32 бита он и первое и второе считает за один такт. А если допустим первое число -8 бит, а второе -32 ? тогда он первое считает за 1 такт, но на второе потратит 2 только на считывание, потом он дожен две части сложить и отбросить лишние биты!!!! Т.Е работаете на intel - работайте с 32 битами.


 
Barloggg   (2005-08-31 14:29) [6]

Так... похоже не все понимают о чем идет речь...
Вот эта формулировка
type tn=record
 case integer of
    0: (a,b:word);
    1: (n:longword);
 end;
end;
предполагает что одни и теже данные можно представить либо как одним лонгвордом либо как двумя вордами. По числу байт это едино и в памяти они занимают одно и тоже место.

Так что я заполняю как а и b а вот складываю как n.
Надо сказать этот вопрос имеет не только теоретическое значение...


 
Barloggg   (2005-08-31 14:31) [7]

получается что складывать одним большим числом быстрее ибо это одна инструкция для процессора а не две. и преобразования тут как такового нету...
Но я сижу на тонком клиенте и проверить скорость работы не могу... может кто-нибудь проверит?


 
Digitman ©   (2005-08-31 14:47) [8]


> одни и теже данные можно представить либо как одним лонгвордом
> либо как двумя вордами


пояснять не требовалось ... как говорится, понятно что лошадь, но только с рогами)


> я заполняю как а и b а вот складываю как n


ну тогда уж не

<заполнение>
sum.n:=ab.n+cd.n;
sum1:=ab.a;
sum2:=ab.b;

а

<заполнение>
sum.n:=ab.n+cd.n;
sum1:=sum.a;
sum2:=sum.b;

и работать это будет правильно лишь при таких значениях полей а и b, что ожидаемая их сумма не превышает 65535

к тому же <заполнение>, очевидно, предполагает непустое кол-во как минимум маш.инструкций сдвига, что сводит на нет всю затею


 
Digitman ©   (2005-08-31 15:03) [9]

если тебе требуется исключительная оптимизация алгоритма сложения по производительности, то лучше всего будет реализация его на встроенном ассемблере - в этом случае можно будет явно задействовать мощь мультиконвейерной архитектуры ЦП, позволяющей в ряде ситуаций параллельную загрузку/выполнение нескольких "независимых" маш.инструкций

например,

movzx eax, a
movzx ebx, b
movzx ecx, c
movzx edx, d

//следующие 2 инструкции (собственно сложение) м.б. выполнены процессором "параллельно"
add eax, ebx
add ecx,edx

mov sum1, eax
mov sum2, ecx


 
tesseract ©   (2005-08-31 15:06) [10]

>>получается что складывать одним большим числом быстрее ибо это одна инструкция для процессора а не две. и преобразования тут как такового нету...
Не факт компилято про этот прикол знает и соответсвенно пытается оптимизировать код.

проверь например sizeof record и packed record


 
Barloggg   (2005-08-31 15:29) [11]

Хелп говорит, что размер выделяется под наибольший из возможных вариантов представления данных...
Проверил. В такой формулировке все поровну. значит используются одни и те же ячейки памяти. И кстати операций сдвига тут скорее всего нету. все же кратно одному байту.


 
Barloggg   (2005-08-31 15:31) [12]

Насчет предварительного заполнения - неактуально. и там и там заполнение.
to [8], да, опечатка. действительно sum а не ab...


 
Юрий Зотов ©   (2005-08-31 15:45) [13]

> Barloggg   (31.08.05 14:29) [6]

> Надо сказать этот вопрос имеет не только теоретическое
> значение...

Значит, для Вашей задачи он имеет еще и практическое значение. Но тогда я не понимаю вот чего - зачем программировать на ЯВУ кусок, в котором буквально требуется считать такты CPU?

????? (крайняя степень недоумения).

Как говорил один знакомый, "Дуся, я тащуся". Раз уж этот кусок НАСТОЛЬКО критичен к скорости, что приходится считать блох, то почему же не написать его на ассемблере?

А если он все же не НАСТОЛЬКО критичен, то какая разница? Пишите, как удобнее, да и все.


 
BFG9k ©   (2005-08-31 18:19) [14]

Вы здесь все точно что-то курите ...


 
Jeer ©   (2005-08-31 18:29) [15]

BFG9k ©   (31.08.05 18:19) [14]

Присоединяйся:)


 
tesseract ©   (2005-08-31 22:19) [16]

>> Вы здесь все точно что-то курите ...

Я лично пью.....


 
Anatoly Podgoretsky ©   (2005-09-01 00:55) [17]

Второй вариант быстрее, но еще одно но, он направильный и даст неверный результат при определенных числах, поскольку возможен перенос из младшего слова.


 
Германн ©   (2005-09-01 01:06) [18]

2 Anatoly Podgoretsky ©   (01.09.05 00:55) [17]

Digitman ©   (31.08.05 14:47) [8]
Уже указал на возмржность ошибки

>и работать это будет правильно лишь при таких значениях полей а и b, что ожидаемая их сумма не превышает 65535



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
3-1123748691
Nilov Serge
2005-08-11 12:24
2005.09.25
из Delphi получить все параметры процедуры MsSql-сервера


1-1125410721
CrowD
2005-08-30 18:05
2005.09.25
Вызов метода минуя непосредственного предка?


2-1123906165
Ivanov
2005-08-13 08:09
2005.09.25
Использование DLL


3-1123755014
Валерий
2005-08-11 14:10
2005.09.25
Непонятки с IN в динамическом SQL-е


14-1125458849
Гриха
2005-08-31 07:27
2005.09.25
Скины