![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбор строки по флагу
Star © (2004-08-07 22:07:00)Дана строка вот такого содержания '254356:23256:5346'. Внимание, вопрос! Как разбить эту строку на три, чтобы каждая начиналась после двоеточия? Т.е.:
254356
23256
5346
Буду очень рад вашей помощи.
DRON (2004-08-09 20:19:00) [1]А у меня с Random было.
Без него 980 и 80.
Fay (2004-08-09 18:48:00) [2]Это на работе. Проц такой же.
Fay (2004-08-09 18:46:00) [3]1) 1234 8)
2) 64
... Это без Random
DRON (2004-08-09 18:39:00) [4]Fay © (09.08.04 18:19) [36]
А у тебя какие цифры? У тебя Max=10^7 ?
Fay (2004-08-09 18:19:00) [5]2 DRON (09.08.04 18:03) [35]
>> AthlonXP 2000+ разница в 30 раз (4500 и 150)
Это очень долго. Страно.
DRON (2004-08-09 18:03:00) [6]Fay © (09.08.04 17:56) [33]:
AthlonXP 2000+ разница в 30 раз (4500 и 150)
DRON (2004-08-09 18:00:00) [7]Sectey © (09.08.04 16:36) [31]:
Мы не изобретаем велосипеды, а делаем их. Это называется программированием и за это деньги платят. По поводу QStrings: практически все функции из неё есть в 7-ой версии (Masks,StrUtils итд), возможно они выполняются чуть быстрее, но я не думаю, что автор делал такое же тестирование как в Borlande, да и VCL их не будет использовать.
Для решения первоначальной задачи можно использовать Q_StrTok но она (в общем случае) не будет быстрее [19], так как изменяет исходную строку (лишнее действие). Кстати, исходник Q_StrTok очень похож на мой вариант :)
To Fay © (09.08.04 17:53) [32]:
Там (в QStrings) просто используются всякие аналоги Move и Compare оптимизированные под современные процы и набор функций активно эти аналоги использующий.
Fay (2004-08-09 17:56:00) [8]2 DRON (09.08.04 16:09) [30]
Я, на самом деле, ожидал ответа типа "у меня Athlon такой-то".
Про остальное - в курсе 8)
Fay (2004-08-09 17:53:00) [9]2 Sectey © (09.08.04 16:36) [31]
Сходите в торгующий велосипедами магазин (побольше). Посмотрите - все велосипеды одинаковые?
Боюсь даже предположить, что я не могу сделать сам такого, что так здорово умеет (предположительно) QStrings.
Sectey (2004-08-09 16:36:00) [10]А мне кажется вы опять начинаете изобретать велосипед :-) Есть библиотека QStrings там работа со string на все случае жизни :-)
DRON (2004-08-09 16:09:00) [11]Так
PChar(s)[i-1]:=chr(random(27)+65);
ещё чуть чуть быстрее так как не вызывается @UniqueString.
to Fay & Diaz:
Разница в скорости тут, по большей части, зависит не от гигагерц, а от скорости памяти и размера кэша (у вас строка 10 метров).
А Button1Click, по большому счёту, проверяет скорость работы менеджера памяти, при его замене цифры совсем другие получаются.
Fay (2004-08-09 12:07:00) [12]У меня C2400/865. Разница в 30 раз.
diaz (2004-08-09 10:55:00) [13]-> Fay [26] celeron-500
Думкин (2004-08-09 07:17:00) [14]> [24] Fay © (09.08.04 06:49)
Ага. :)
Fay (2004-08-09 07:16:00) [15]2 diaz (09.08.04 07:11) [25]
У тебя какой проц?
diaz (2004-08-09 07:11:00) [16]-> Думкин [23] второй в 40 раз быстрее !
Fay (2004-08-09 06:49:00) [17]2 Думкин © (09.08.04 06:29) [23]
Результаты будут намного интереснее, если не вычислять символ, а колотить константу.
Думкин (2004-08-09 06:29:00) [18]> [22] DRON (09.08.04 02:02)
Угу.
> [21] diaz (08.08.04 18:49)
Покури такое:
const Max = 10000000;
procedure TfMain.Button1Click(Sender: TObject);
var s : string;
i : integer;
a : Cardinal;
begin
s := '';
a := GetTickCount;
Screen.Cursor := crHourGlass;
try
for i := 1 to Max do s := s + chr(random(27)+65);
Button1.Caption := Format('%d ms',[GetTickCount - a])
finally
Screen.Cursor := crDefault
end
end;
procedure TfMain.Button2Click(Sender: TObject);
var s : string;
i : integer;
a : Cardinal;
begin
SetLength(s, Max);
a := GetTickCount;
Screen.Cursor := crHourGlass;
try
for i := 1 to Max do s[i] := chr(random(27)+65);
Button2.Caption := Format('%d ms',[GetTickCount - a])
finally
Screen.Cursor := crDefault
end
end;
DRON (2004-08-09 02:02:00) [19]to: diaz (08.08.04 18:47) [20]
число переменных скорость не уменьшает (наоборот можно заранее что-то вычислить и брать затем из переменной), inc не функция - компилятор ставит просто инструкцию inc; low - в большинстве случаев известен на этапе компиляции (то есть это просто константа); SetString - самый быстрый способ получения строки в Delphi-йском формате (работа с самим PChar конечно быстрее из за отсутствия подсчёта ссылок), а вот в цикле из [13] чёрт знает сколько раз вызывается @LStrFromChar, а ещё @LStrCat которая на каждый символ исходной строки дёргает менеджер памяти, что вообще ни в какие ворота не лезет. Нажми Ctrl+Alt+C и посмотри во что превращается с виду безобидная " m1[k]:=m1[k]+s[i] ", дажеSetLength(m1[k],Length(m1[k])+1);m1[k][Length(m1[k])]:=s[i]и то быстрее выполняется потому что у компилятора нет специальной функции для добавления символа к строке, он переводит один символ в строку (выделяя для него место на куче!), а потом использует универсальную функцию для сложения строк (которая не оптимизированна под добавление одного символа).
diaz (2004-08-08 18:49:00) [20]diaz [20] - это я в защиту YurikGL [13]