Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Вниз
копирование нестандартной длины строки Найти похожие ветки
← →
begin...end © (2005-02-23 18:07) [40]> olookin © (23.02.05 17:54) [32]
Убыстряет.const
SymbolsCount = 100000;
DecimalSymbols = "0123456789";
var
I: Integer;
S: string;
T1, T2, Count1, Count2: Cardinal;
begin
// Заполнение строки
SetLength(S, SymbolsCount);
Randomize;
for I := 1 to SymbolsCount do
S[I] := Chr(Random(255));
// Тест с множеством
Count1 := 0;
T1 := GetTickCount;
for I := 1 to Length(S) do
if S[I] in ["0".."9"] then
Inc(Count1);
T1 := GetTickCount - T1;
// Тест с Pos
Count2 := 0;
T2 := GetTickCount;
for I := 1 to Length(S) do
if Pos(S[I], DecimalSymbols) > 0 then
Inc(Count2);
T2 := GetTickCount - T2;
ShowMessageFmt("Count1 = %d, Count2 = %d, множество: %d мс; Pos: %d мс", [Count1, Count2, T1, T2])
end.
← →
Palladin © (2005-02-23 18:07) [41]обойдешься всего лишь одним оператором IN
← →
olookin © (2005-02-23 18:11) [42][40] begin...end © (23.02.05 18:07)
Может я и ошибаюсь, но GetTickCount не является точным методом определения времени выполнения КОНКРЕТНОЙ задачи. Может, лучше использовать QueryPerformanceFrequency/QueryPerformanceCounter?
← →
begin...end © (2005-02-23 18:13) [43]> olookin © (23.02.05 18:11) [42]
Не думаю, что GetTickCount может в данном случае дать ошибку в 100 раз и более. Но если сомневаетесь - используйте QueryPerformanceCounter и сообщите, пожалуйста, о результатах.
← →
Юрий Зотов © (2005-02-23 18:18) [44]> olookin © (23.02.05 18:04) [39]
Все не так.
← →
olookin © (2005-02-23 18:18) [45][43] begin...end © (23.02.05 18:13)
Да я не сомневаюсь. Насчет теста QueryPerformanceCounter - я тест этой функции делал с секундомером в руках. Что уж совсем по идиотски звучит...
А насколько различно по времени выполнение Ваших двух тестов (множество vs Pos)? Ну чтоб мне не пробовать....
← →
olookin © (2005-02-23 18:19) [46][44] Юрий Зотов © (23.02.05 18:18)
Good а как?
← →
begin...end © (2005-02-23 18:24) [47]> olookin © (23.02.05 18:18) [45]
Pentium 3, 533 МГц (только не смейтесь).
1. SymbolsCount = 100000: Count1 = 3953, Count2 = 3953, множество: 10 мс; Pos: 110 мс.
2. SymbolsCount = 1000000: Count1 = 39218, Count2 = 39218, множество: 10 мс; Pos: 1031 мс.
← →
olookin © (2005-02-23 18:25) [48][47] begin...end © (23.02.05 18:24)
Внушительное различие. Складаю оружие и признаю Вашу правоту...
← →
Юрий Зотов © (2005-02-23 18:28) [49]> olookin © (23.02.05 18:19) [46]
Для простоты возьмем множество, состоящее не более, чем из 32 элементов. Поскольку элементы множества всегда упорядочены, то каждому из них можно сопоставить двоичный разряд 32-битного числа. Тогда вхождение элемента во множество можно отмечать единицей в соответствующем ему разряде, а отсутствие - нулем. И проверка вхождения элемента сведется к одноразому AND, без всяких циклов.
Почти то же самое происходит и в реальности. Никаких циклов.
← →
Юрий Зотов © (2005-02-23 18:28) [50]> olookin © (23.02.05 18:19) [46]
Для простоты возьмем множество, состоящее не более, чем из 32 элементов. Поскольку элементы множества всегда упорядочены, то каждому из них можно сопоставить двоичный разряд 32-битного числа. Тогда вхождение элемента во множество можно отмечать единицей в соответствующем ему разряде, а отсутствие - нулем. И проверка вхождения элемента сведется к одноразому AND, без всяких циклов.
Почти то же самое происходит и в реальности. Никаких циклов.
← →
olookin © (2005-02-23 18:30) [51][50] Юрий Зотов © (23.02.05 18:28)
Да, это убедительно...
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.037 c