Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.05 c
14-1125277977
Учащийся
2005-08-29 05:12
2005.09.25
Как в фотошопе нарисовать элипс толщиной в пиксель?


14-1125342771
ХорошийЧЕЛ
2005-08-29 23:12
2005.09.25
Создание анимации в Adobe ImageReady


1-1125317950
Cherrex
2005-08-29 16:19
2005.09.25
Как динамически добавить компонент на форму


2-1124097041
root187
2005-08-15 13:10
2005.09.25
ustanovka BDE


2-1124179066
-=snoop=-
2005-08-16 11:57
2005.09.25
функция RenameFile, не могу разобраться..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский