Войти
ПрограммированиеФорумОбщее

Delphi 2009 - Оптимизация вашего приложения. (4 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#45
19:08, 25 июня 2009

project_manager
только эта процедура значение неверно считает... не учитывает минус, в остальном все верно


#46
19:09, 25 июня 2009

Neill
Почему?

#47
19:11, 25 июня 2009

project_manager
все верно, число с минусом было, а в этой функции он не учитывается...

#48
19:13, 25 июня 2009
const
 Null_int   = 0;
 Null_float = 0.0;

function StrToInt_New( _text: pchar; const defvalue: int = Null_int): int;
var
 neg: bool;
begin
result:= defvalue;
if _text = nil then exit;
neg:=_text[0] = #45;
inc(_text, ord(neg) );
// for
while _text[0] <> #0 do
 begin
 result := ( ( result * 10) + ubyte( _text[0]) - 48);
 inc( _text );
 end;
 if neg then exit ( -result );
end;
StrToInt_speed:422
StrToInt_New:203
===============
Int test: speedUp:x2,08
===============

В сравнении в стандартной функции мы(Reev, Sergio666, entryway) её перегнали в 8-9 раз.
вот тест:
app test std vs ....

#49
23:01, 25 июня 2009

вот переписал по типу... :

function StrToFloat_New(  _text: pchar; defvalue: float = Null_float): float;
var
 asInt: int absolute result; // value assigned result
 ln : int;                   // extent
 neg: bool;                  // negative mark
begin
Result:= 0;
if _text = nil then exit( defvalue );     // check empty-text

neg:=_text[0] = #45;          // check "negative"

asInt:= 0;                    // as Int

ln:= 0;                       // set extent = 0 = no use

inc(_text, ord( neg ) );      // del symbol "negative" char

while _text[0] <> #0 do       // loop
 begin
 if _text[0] = #46 then       // chech decimal separator
  begin
  ln:= 1;
  inc( _text );
  end;

  asInt := (asInt * 10) + ubyte( _text[0]) - 48;    // - asInt
  ln := ln * 10;                                    // extent * 10;
  inc( _text );                                     // next char
 end;
 // negative value ?
 if neg then
  exit ( ( - asInt ) / ln )
 else
  exit ( (   asInt ) / ln );          // return result(negative?)
end;

#50
23:25, 25 июня 2009

project_manager
> перегнали в 8-9 раз.
1. Без проверки символов эту процедуру применять нельзя. Ну, разве что есть желание ловить потом неуловимых багов и наблюдать "чудеса".
2. Также нет проверки на переполнение.
3. Нет обработки занака '+', а должна

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

#51
0:08, 26 июня 2009

doc.
это все поправимо)

#52
1:05, 26 июня 2009

project_manager
> это все поправимо)
вот когда оно поправится, вот тогда и следует рапортовать о многократном превосходстве ;)

#53
8:11, 28 июня 2009

doc.
> Нет обработки занака '+', а должна

Ловите. Скорость та же:

function StrToInt_Sergio666(s:PAnsiChar):integer;
var n : byte;
begin
 n:=ord(s[0] = '-');
 inc(s, 1 + n + ord(s[0] = '+'));

 result:=ord(s[-1]) - 48;
 while s[0] <> #0 do begin
  result:=result * 10 + ord(s[0]) - 48;
  inc(s);
 end;

 result:=result - 2*n*result;
end;

#54
10:57, 28 июня 2009

а, может, стоит заглянуть сюда - http://fastcode.sourceforge.net/

#55
15:53, 28 июня 2009

Вот написал безбранчевую функцию. Понимает числа в диапазоне от -99999999 до 99999999. Обработки знака "+" нету.

function strtointMMX(s: PChar): integer;assembler;register;
const
  c48:array[0..3] of word=(48,48,48,48);
  m:  array[0..6] of word=(1000,100,10,1,0,0,0);
  m2: array[0..19] of word=(10000,10000,1,1,
                           1000,1000,1,1,
                           100,100,1,1,
                           10,10,1,1,
                           1,1,0,0);
asm
  cmp       byte[eax],'0'
  sbb       edx,edx
  sub       eax,edx
  pxor      mm2,mm2
  movq      mm3,[eax]
  punpcklbw mm0,[eax]
  punpcklbw mm1,[eax+4]
  pcmpeqb   mm3,mm2
  pmovmskb  eax,mm3
  or        eax,256
  bsf       ecx,eax
  neg       ecx
  psrlw     mm0,8
  psrlw     mm1,8
  psubusw   mm0,[c48]
  psubusw   mm1,[c48]
  mov       eax,-4
  cmp       eax,ecx
  cmovl     eax,ecx
  pmaddwd   mm0,qword[m+8+eax+eax]
  pmaddwd   mm1,qword[m+16+ecx+ecx]
  packssdw  mm0,mm1
  sub       ecx,eax
  pmaddwd   mm0,qword[m2+32+ecx*8]
  pshufw    mm1,mm0,1110b
  paddd     mm0,mm1
  movd      eax,mm0
  emms
  xor       eax,edx
  sub       eax,edx
end;
Потестите на скорость.

>>Правка
Поправил код

#56
16:45, 28 июня 2009

щяс попробуем.=)

#57
17:33, 28 июня 2009

murder
1) Твоя медленнее в 5-10% чем в посте #53
2) Портит переменные.
3) Нет знака +

#58
17:59, 28 июня 2009

кст кто не знал новые(D7 vs 2007..) фитчи делфи смотрим тут: http://www.interface.ru/home.asp?artId=6763

#59
19:00, 28 июня 2009

>>Твоя медленнее в 5-10% чем в посте #53
Хм... Этого стоило ожидать :(  т.к. сложность практически O(1) - скорость не зависит от длины числа. Я расчитывал, что она будет быстрее на 8-значных числах.

Ну чтож, попробую без MMX сделать.

>>Портит переменные.
Спасибо, что сказал - теперь всё нормально.

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.