Самому стало интересно. Сделал ряд опытов. Забыл выложить, исправляюсь.
Создал генератором 2 файла в одном полные адреса, во втором только значимая часть.
Первые два теста не работа с файлом, а вырезание короткой части.
Тест 1 - вариант Андрея
Тест 2 - вложенными условиями
Искать буду существующий адрес (для контроля) записанный последним для равного числа переборов.
Тестовый файл взял на 1000 адресов.
Результаты привожу для компа с работы, довольно тормознутого. Чем быстрее комп тем меньше разница в результатах.
результат
47 и
22 мс соответственно
В принципе эта часть вызывается всего 1 раз при каждом поиске, поэтому сильно не влияет. Но всё-таки.
Тест 3 - прямым перебором строк напрямую сравниваем длинные адреса с длинным образцом
Тест 4 - то же, для коротких адресов
Тест 5 - не удался из-за ограничения длины переменной в 4.8, пришлось пропустить
Тест 6 - короткие адреса, через массив. Считываем файл 1 раз, далее работаем с массивом параллельно дописывая в файл новые данные.
Тест 7 - сделал поиск в файле в AutoIt, параметры передавал/принимал через ini. Учтено время, в т.ч на вызов exe.
Результаты:
13:59:27 Время теста
13:59:27 Тест 1 47 мс
13:59:27 Тест 2 22 мс
13:59:27
13:59:27 Тест 3. Длинные 1337 мс
13:59:27 Тест 4. Короткие 1108 мс
13:59:27 Тест 6. Короткие в массив 522 мс
13:59:27 Тест 7. Короткие. Вызов AutoIt 111 мс
Выводы:
короткие адреса дают выигрыш против длинных
-17%, смысл есть.
массивы против прямого перебора из файла дают выигрыш
-52%, смысл есть.Не знаю, почему у тебя получилось одинаково.
через вызов сторонней скомпилированной программы (знал бы С++ сделал бы на нём) против массивов
-78%, против коротких прямых
-90%Если нигде не накосячил...
Все файлы во вложении.
Само собой от запуска к запуску результаты чуть разнятся.
Массивы это хорошо. В чистом кликере нужно через них.
Автоит не рекламирую. Кстати в обычном, не скомпилированном скрипте результаты точь в точь совпадают с результатами на массивах в кликере. Это толстый намёк на необходимую не только для закрытости компиляцию...
Можно ещё ускорить, разделив хранящиеся данные по 4 файлам в зависимости от домена. mail, bk, inbox, list. И искать каждый только в своём домене.
Предполагаю, что в домене mail адресов гораздо больше, чем в других. Нужно сделать анализ, подсчитать реальные адреса. И если mail = bk+inbox+list можно делить на 2 файла.
Если конечно предполагается большая база, то лучше на 4. Я бы выжимал скорость сразу всеми способами, даже дающими незначительное ускорение.
#name "Работа с файлом"
// Author: Vint
// Version: 1.1 (28.01.2014)
// Для 4.9 (003)
//==============================================================================
SUB (itog) // вывод затраченного времени
$test_time = $_ms-$start
LOGWRITE ("Время теста. Вариант ", $v1, " ", $test_time, " мс")
LOGWRITE (" ")
LOGWRITE ("-------------------------------------------------")
END_SUB
//==============================================================================
LOGCLEAR
// тест 1 вариант 1 длинный адрес
$start = $_ms
$v1 = 1
for($var, $var < 10)
$pos = 0
$_ankf = TFRead("name.txt", $var+1)
IF((STRPOS ($_ankf, "mail/") > 0) & ($pos = 0))
$pos = STRPOS($_ankf, "mail/") + 5
END_IF
IF((STRPOS($_ankf, "inbox/") > 0) & ($pos = 0))
$pos = STRPOS($_ankf, "inbox/") + 6
END_IF
IF((STRPOS($_ankf, "list/") > 0) & ($pos = 0))
$pos = STRPOS($_ankf, "list/") + 5
END_IF
IF((STRPOS($_ankf, "bk/") > 0) & ($pos = 0))
$pos = STRPOS($_ankf, "bk/") + 3
END_IF
$_ankf = STRCUT2($_ankf, $pos, 100)
//LOGWRITE ($_ankf)
END_CYC
itog()
$test_time1 = $test_time
// тест 2 вариант 2 короткий адрес
UNDEFINE($url)
$start = $_ms
$v1 = 2
for($var, $var < 10)
$url = TFRead("name.txt", $var+1)
IF(STRPOS ($url, "mail/") > 0)
$url = STRCUT2($url, STRPOS($url, "mail/")+5, 100)
ELSE
IF(STRPOS ($url, "inbox/") > 0)
$url = STRCUT2($url, STRPOS($url, "inbox/")+6, 100)
ELSE
IF(STRPOS ($url, "list/") > 0)
$url = STRCUT2($url, STRPOS($url, "list/")+5, 100)
ELSE
IF(STRPOS ($url, "bk/") > 0)
$url = STRCUT2($url, STRPOS($url, "bk/")+3, 100)
END_IF
END_IF
END_IF
END_IF
$url = STRCUT2($url, 1, STRPOS($url, "/")-1)
//LOGWRITE ($url)
END_CYC
itog()
$test_time2 = $test_time
// тест 3 прямое сравнение длинных
UNDEFINE($url)
$ank = "http://my.mail.ru/mail/aicauro/"
$start = $_ms
$v1 = 3
for ($i, $i<TFCOUNT("name.txt"))
$url = TFRead("name.txt", $i+1)
IF($ank = $url)
LOGWRITE ("Имя есть в базе")
END_IF
end_cyc
itog()
$test_time3 = $test_time
// тест 4 прямое сравнение коротких
UNDEFINE($url)
$ank = "aicauro"
$start = $_ms
$v1 = 4
for ($i, $i<TFCOUNT("name_small.txt"))
$url = TFRead("name_small.txt", $i+1)
IF($ank = $url)
LOGWRITE ("Имя есть в базе")
END_IF
end_cyc
itog()
$test_time4 = $test_time
// тест 5 короткие в строку
//UNDEFINE($url)
//$ank = "aicauro"
//$url = ""
//$v1 = 5
//for ($i, $i<TFCOUNT("name_small.txt"))
// $url = STRCONCAT($url, TFRead("name_small.txt", $i))
//end_cyc
//LOGWRITE ("$url = ", $url)
//LOGWRITE ("Len ", STRLEN($url))
//$start = $_ms
//IF(STRPOS($url, $ank) > 0)
// LOGWRITE ("Имя есть в базе")
//ELSE
// //LOGWRITE ("Имени нет в базе")
//END_IF
//$url = STRCONCAT($url, $ank)
//GOSUB(itog)
//$test_time5 = $test_time
// тест 6 короткие в массив
UNDEFINE($url)
$ank = "aicauro"
$url = ""
$v1 = 6
for ($i, $i<TFCOUNT("name_small.txt"))
$data = TFRead("name_small.txt", $i+1)
ARRPUSH($url, $data)
end_cyc
//LOGWRITE ("ARRSIZE = ", ARRSIZE($url2))
$start = $_ms
for ($i, $i < ARRSIZE($url))
IF($ank = $url[$i])
LOGWRITE ("Имя есть в базе")
END_IF
end_cyc
$url = ARRPUSH($url, $ank)
itog()
$test_time6 = $test_time
// тест 7 вызов AutoIt
UNDEFINE($url)
$ank = "aicauro"
$url = ""
$v1 = 7
INIWRITE("name.ini","file","name_small.txt")
$start = $_ms
INIWRITE("name.ini","ank",$ank)
INIWRITE("name.ini","return","-1")
EXECUTE("Find file.exe")
WHILE(INT(INIREAD("name.ini", "return")) = -1) // ожидание
WAITMS(30)
//LOGWRITE ("Ждём")
END_CYC
IF(INT(INIREAD("name.ini", "return")) = 1)
LOGWRITE ("Имя есть в базе")
END_IF
itog()
$test_time7 = $test_time
WAIT(1)
LOGWRITE (" ")
LOGWRITE ("Время теста")
LOGWRITE ("Тест 1 ", $test_time1, " мс")
LOGWRITE ("Тест 2 ", $test_time2, " мс")
LOGWRITE (" ")
LOGWRITE ("Тест 3. Длинные ", $test_time3, " мс")
LOGWRITE ("Тест 4. Короткие ", $test_time4, " мс")
//LOGWRITE ("Тест 5. Короткие в строку ", $test_time5, " мс")
LOGWRITE ("Тест 6. Короткие в массив ", $test_time6, " мс")
LOGWRITE ("Тест 7. Короткие. Вызов AutoIt ", $test_time7, " мс")
HALT