169 похожих чатов

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

мин. и макс. значения:
C#
static int GetMin(int a, int b) {
int delta = a - b;
return b + (delta & (delta >> 31));
}
static int GetMax(int a, int b) {
int delta = a - b;
return a - (delta & (delta >> 31));
}
интересно - это что реально быстрее сравнения будет?

11 ответов

17 просмотров

Сделай сравнение? Интересно на паскале что получится??

notme- Автор вопроса
zamtmn
Сделай сравнение? Интересно на паскале что получит...

https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax Нашёл на счет сравнения.... надо подумать

notme- Автор вопроса
zamtmn
Сделай сравнение? Интересно на паскале что получит...

program project1; {$WRITEABLECONST OFF} {$IFDEF FPC} {$ASMMODE intel} {$ENDIF} uses SysUtils, Math; function max_cmov(x, y: Integer): Integer; assembler; asm cmp y, x mov ecx, x cmovge ecx, y mov eax, ecx end; const k = 200; var a: array of Integer = nil; max, x, y: Integer; i, n, c: Cardinal; t1, t2: TDateTime; s: String; begin Randomize; SetLength(a, 10*1000*1000); for i:=Low(a) to High(a) do a[i]:=Random(MaxInt); for c:=0 to 2 do begin t1:=Now; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do max := max + Math.Max(a[i], a[i+1]); t2:=Now; DateTimeToString(s, '.ss.zzz', t2-t1); WriteLn('Math.Max: ', max, ', t:', s, 's'); t1:=Now; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do max := max + max_cmov(a[i], a[i+1]); t2:=Now; DateTimeToString(s, '.ss.zzz', t2-t1); WriteLn('max_cmov1: ', max, ', t:', s, 's'); t1:=Now; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do begin x:=a[i]; y:=a[i+1]; asm mov eax, x cmp y, eax cmovge eax, y add max, eax end{$IFDEF FPC}['eax']{$ENDIF}; end; t2:=Now; DateTimeToString(s, '.ss.zzz', t2-t1); WriteLn('max_cmov2: ', max, ', t:', s, 's'); t1:=Now; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do if a[i]>a[i+1] then max:=max+a[i] else max:=max+a[i+1]; t2:=Now; DateTimeToString(s, '.ss.zzz', t2-t1); WriteLn('if then1: ', max, ', t:', s, 's'); t1:=Now; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do if a[i]<a[i+1] then max:=max+a[i+1] else max:=max+a[i]; t2:=Now; DateTimeToString(s, '.ss.zzz', t2-t1); WriteLn('if then2: ', max, ', t:', s, 's'); t1:=Now; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do max:= max + (a[i] xor ((a[i] xor a[i+1]) and -Integer(a[i] < a[i+1]))); t2:=Now; DateTimeToString(s, '.ss.zzz', t2-t1); WriteLn('bithack: ', max, ', t:', s, 's'); end; WriteLn('Done... press key...'); ReadLn; end. Полная фигня Работает хак-то!

notme- Автор вопроса
notme- Автор вопроса
notme- Автор вопроса
notme- Автор вопроса

обновил код, совместимость с Delphi @zamtmn ☝️бинарник Delphi

notme
обновил код, совместимость с Delphi @zamtmn ☝️бина...

с gettickcount ... если нужно program project1; {$WRITEABLECONST OFF} uses SysUtils, Math; function max_cmov(x, y: Integer): Integer; assembler; inline; asm cmpl %ecx, %edx movl %ecx, %eax cmovge %edx, %eax end; const k = 200; var a: array of Integer = nil; max: Integer; i, n, c: Cardinal; s: String; t1:cardinal; begin Randomize; SetLength(a, 10*1000*1000); for i:=Low(a) to High(a) do a[i]:=Random(MaxInt); for c:=0 to 2 do begin t1:=GetTickCount; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do max += Math.Max(a[i], a[i+1]); WriteLn('Math.Max: ', max, ', t:', IntToStr(GetTickCount - t1), 'ms'); t1:=GetTickCount; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do max += max_cmov(a[i], a[i+1]); WriteLn('max_cmov: ', max, ', t:', IntToStr(GetTickCount - t1), 'ms'); t1:=GetTickCount; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do if a[i]>a[i+1] then max+=a[i] else max+=a[i+1]; WriteLn('if then1: ', max, ', t:', IntToStr(GetTickCount - t1), 'ms'); t1:=GetTickCount; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do if a[i]<a[i+1] then max+=a[i+1] else max+=a[i]; WriteLn('if then2: ', max, ', t:', IntToStr(GetTickCount - t1), 'ms'); t1:=GetTickCount; max := 0; for n:=0 to k do for i:=Low(a) to Pred(High(a)) do max+=a[i] xor ((a[i] xor a[i+1]) and -Integer(a[i] < a[i+1])); WriteLn('bithack: ', max, ', t:', IntToStr(GetTickCount - t1), 'ms'); end; WriteLn('Done... press key...'); ReadLn; end.

notme- Автор вопроса
А
с gettickcount ... если нужно program project1; {...

не портабельно, хочу потом на других архитектурах потестить

notme- Автор вопроса
notme
program project1; {$WRITEABLECONST OFF} {$IFDEF FP...

Обновил код оказывается у Delphi была фора в тесте max_cmov - она не создает фреймы отключил у FPC тоже

Похожие вопросы

Обсуждают сегодня

Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Добрый день! Подскажите, пожалуйста: какими компетенциями нужно обладать, чтобы претендовать на работу эрланг (отдельная благодарность, если про элексир тоже подскажете) разр...
via ☸️ led
20
Всем привет. Ребят подскажите пожалуйста. Вопрос по дизасемблировани. Начну с начала. У меня есть скомпилированная программа на ГО (я разработчик) - в ней есть защита лицензии...
Zloy
11
Можно попросить небольшое ревью кода? Тут немнога, я ничего интереснее не придумал, чем написать аналог tree в качестве практики с cmake. https://github.com/hrimov/tree-unix/...
Andrew Hrimov
11
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Карта сайта