avmaksimov писал(а):Скажите, не пробовали ли вы через "чистую математику"?)
ну у меня как раз "чистая математика". Сделать выборку для всех символов, все разом перевести в значение, а потом сложить... Это может быть быстрее только для больших чисел, а в большинстве своём мы до миллиона не так часто доходим. Я далеко не уверен, что будет быстрее.
Я больше склоняюсь к тому, чтоб эту функцию можно было использовать в многопоточке, и не важно используется она уже где-то или нет. Но пока не занимался этим.
avmaksimov писал(а):Что быстрее ваш код или библиотечный IntToStr?
Проверил, мой быстрее. А тот, что на ассемблере, ещё быстрее, потому что там куча лишних действий убрано.
И, да
он быстрее этого кода.
(Человек делавший тот код, не захотел его оптимизировать в скорость. Почему? Я не знаю. Но за счёт его кода, я ускорил свой и понял как можно убрать лишние вычисления которые вносит компилятор FPC.
Ну и приходится быть зависимым от кодировки символов. Если кодировка страницы неправильно выставлена, то очень сильно может потеряться скорость.)
нет, это другой код, очень похожий.
avmaksimov писал(а):Я честно говоря, снова не понял, почему вы не поняли, если я уже другому человеку сказал, что тот неверно понял))))
потому что я прочитал тот пост позже. ))) А до этого думал про обычный перевод.
avmaksimov писал(а):Какая точка в дробной части?
Я про числа с плавающей точкой (хотя использовать можно для всех). Если число уже переведено в строку, то достаточно разделитель найти и воткнуть пробелы по местам.
avmaksimov писал(а):Ну как бы тут не студенты вроде собрались - все понимают, что для работы нужно работать с числом, а выводить для человека только результат.
лучше по себе не судить. Я очень часто встречаюсь, где люди хранят числа в текстовом варианте. Не все тут программисты и не все понимают, что это лишние действия. ))) Не в обиду им!
avmaksimov, давай глянем...
iskander писал(а):А что насчёт вот такого варианта?
выдёргиваем нужное из его кода:
- Код: Выделить всё
const
Decs: array[0..9] of Char = ('0','1','2','3','4','5','6','7','8','9');
и делаем заново:
- Код: Выделить всё
const
DecTable: array[0..9] of Char = ('0','1','2','3','4','5','6','7','8','9');
function IntToStrNew(Value: Int64): string;
var
_Res: array[0..26] of Char;
i, j, n: int64;
minus: boolean = false;
label
GoEnd;
begin
if Value = 0 then
begin
Result := '0';
exit;
end;
Result := '';
n := 0;
j := 0;
if Value < 0 then
begin
minus := true;
Value := abs(Value + 1);
end;
// тут надо сделать шаг, если значение было минусовое
if minus then
begin
i := Value mod 10 + 1;
Value := Value div 10;
if i > 9 then
begin
inc(Value);
_Res[j] := '0';
end
else
_Res[j] := DecTable[i];
inc(j);
inc(n);
if Value = 0 then
goto GoEnd;
end;
while Value > 9 do
begin
i := Value mod 10;
Value := Value div 10;
_Res[j] := DecTable[i];
inc(j);
inc(n);
if n = 3 then
begin
_Res[j] := ' ';
inc(j);
n := 0;
end;
end;
_Res[j] := DecTable[Value];
GoEnd:
if minus then
Result := Result + '-';
While j >= 0 do
begin
Result := Result + _Res[j];
dec(j);
end;
end;
выставляю лицензию
ZLib на код. )))
проверяйте. )))
Добавлено спустя 8 минут 32 секунды:Re: Конвертация Int64 с разделителем групп разрядов: неужели?!)походу бесполезный код... я его почти с первого раза и практически без ошибок написал...
Добавлено спустя 2 минуты 39 секунд:Re: Конвертация Int64 с разделителем групп разрядов: неужели?!)Ну и, возможно быстрее было бы сразу в строку копировать данные. Надо это или нет?