Что нового

[Массивы] Скорость обрботки массивов

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Возник такой вопрос, скорей больше теоретический, чем практический..
Кто-нибудь видел тесты на скорость обработки массивов? Смысл в том, что компилятор Autoit формирует некий исполняемый код. Насколько быстр компилятор?
Например, есть массив, в котором надо найти определенный элемент. Так вот, стоит ли, например, загнать данные массива в базу данных и средствами sqlite осуществить поиск, или функция _ArraySearch быстрее?

Или вот включение элемента в массив - добавления элемента в базу будет работать быстрее, чем добавление элемента в массив?

Честно, пишу потому, что можеит кто озадачивался таким вопросом, и чт-то где0то уже читал. Просто есть БОЛЬШОЙ массив данных, который надо распихать по таблицам, скрипт на Access работает 22 часа, вроде оптимизировал уже все что мог. Пылающий взор остановился на AutoIt, встал вопрос будет ли это быстрее, ели данные обработать в массивах, а потом выгрузить в текстовый файл. Так как эксперименты грозятся затянуться надолго, то прошу дружеского совета.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
http://autoit-script.ru/index.php/topic,2427.msg17703.html#msg17703
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
Vlasssov
быстрота - однозначно, не самое большое достоинство AutoIt. Не говоря уже о реляционных БД и СУБД работаюших с ними. Уж не знаю, "как" там все оптимизировано в Access, но ничтожно мало вероятно, что на AutoIt быстрее
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я думаю, на то, что бы загнать все данные в SQL потребуется намного больше времени.
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Будете писать - учтите что ReDim работает довольно медленно, нельзя в цикле запускать.


Добавлено:
Сообщение автоматически объединено:

Просто есть БОЛЬШОЙ массив данных, который надо распихать по таблицам

Perl или Python вам в помощь. Perl оптимизирован для обработки текста и в подобных задачах работает в 2 раза быстрее c# и в 10 раз быстрее AutoIt и Ruby.

Насколько большой массив? Если 10 - 100 мегабайт, то на AutoIt можно попробовать. Если речь о гигабайтах, то Perl.
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Это как без redim массив на один элемент увеличить?
Нет, там не гигабайты.
perl - вроде как интерпретатор, для его установки придется web сервер городить.
Хорошо, вот есть собственно два стандартных действия с массивами данных
1. Поиск определенно элемента
2. Добавление элемента в массив
3. Сортировка данных по ключу

Существует несколько стандартных алгоритмов, которые реализуют данные функции, ну там быстрая сортировка и т.д.
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Perl выполняется точно также, как AutoIt. Причем, не только в Windows, но и на любой другой оси. Можно сжать в exe-шник, как и AutoIt, только побольше будет размером.


Добавлено:
Сообщение автоматически объединено:

Vlasssov [?]
1. Поиск определенно элемента 2. Добавление элемента в массив3. Сортировка данных по ключу

AutoIt это может делать. Скорость, конечно, не фонтан, но справляется. Можно делать n-мерные массивы, хеши не поддерживаются.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vlasssov [?]
Это как без redim массив на один элемент увеличить?
Не нужно увеличивать на один. Задаём изначально определёный размер массива, и увеличиваем только при его достижений:

Код:
#include <Array.au3>

$iArrDim = 1000
$iArrReDim = $iArrDim
Dim $aArray[$iArrDim + 1]

$iArrLoop = 5000

For $i = 1 To $iArrLoop
	$aArray[0] += 1
	$aArray[$aArray[0]] = "Var" & $i
	
	If $i < $iArrLoop And $aArray[0] >= $iArrReDim Then
		$iArrReDim += $iArrDim
		ReDim $aArray[$iArrReDim + 1]
	EndIf
Next

_ArrayDisplay($aArray)
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
А в стандартной процедуре в Array как?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
По идее вот так можно было бы сделать:

Код:
#include <Array.au3>

$iArrDim = 1000
$iArrReDim = $iArrDim
Dim $aArray[$iArrDim + 1]

$iArrLoop = 5000

For $i = 1 To $iArrLoop
	$aArray[0] += 1
	_ArrayAddEx($aArray, "Var" & $i, 0, $aArray[0])
	
	If $i < $iArrLoop And $aArray[0] >= $iArrReDim Then
		$iArrReDim += $iArrDim
		ReDim $aArray[$iArrReDim + 1]
	EndIf
Next

_ArrayDisplay($aArray)

Func _ArrayAddEx(ByRef $avArray, $vValue, $iReDim = 1, $iIndx = 0)
	If Not IsArray($avArray) Then
		Return SetError(1, 0, -1)
	EndIf
	
	If UBound($avArray, 0) <> 1 Then
		Return SetError(2, 0, -1)
	EndIf
	
	Local $iUbound = UBound($avArray)
	
	If $iReDim Then
		$iIndx = $iUbound
		ReDim $avArray[$iUbound + 1]
	EndIf
	
	If $iIndx >= $iUbound Then
		$iIndx = $iUbound-1
	EndIf
	
	$avArray[$iIndx] = $vValue
	Return $iUbound
EndFunc
 

SyDr

Сидра
Сообщения
651
Репутация
158
:whistle:
Код:
$a = TimerInit()
$b = 10000
Dim $c[1]
For $d = 0 To $b ; вариант с + 1
	ReDim $c[UBound($c, 1) + 1]
Next
$d = TimerDiff($a)

ReDim $c[1]
$a = TimerInit()

For $e = 0 To $b ; вариант с * 2
	If UBound($c, 1) -1 = $d Then ReDim $c[UBound($c, 1) * 2]
Next

ReDim $c[$b + 1]
$e = TimerDiff($a)

MsgBox(4096, Default, "+1: " & $d & @CRLF & "*2: " & $e)
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
CreatoR сказал(а):
В какой ещё стандартной?

Пардон, глупость сморозил. Я тут про сортировку думал.. Есть стандартный алгоритм включения элемента в массив, уже отсортированный. Так вот он там сразу ставится на определенное место, что потом облегчает поиск.

Вопрос еще вот так повернуть можно: массив, который находится в памяти, будет быстрей обрабатываться, чем таблица в базе данных? Чтобы теоретически в это разбираться, тут надо смотреть, как база открывается, как в память помещается и т.д. и т.п. А вот чисто из личного опыта?

Есть в AutoIT библиотека для работы с SQLite. Берем массив
$mas[11][5000]
Если в нем искать нужный элемент типа строка, то что будет быстрее работать
_ArrayFindAll
Или
_SQlite_Query "SELECT *..."
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
SyDr сказал(а):
:whistle:
Код:
$a = TimerInit()
$b = 10000
Dim $c[1]
For $d = 0 To $b ; вариант с + 1
	ReDim $c[UBound($c, 1) + 1]
Next
$d = TimerDiff($a)

ReDim $c[1]
$a = TimerInit()

For $e = 0 To $b ; вариант с * 2
	If UBound($c, 1) -1 = $d Then ReDim $c[UBound($c, 1) * 2]
Next

ReDim $c[$b + 1]
$e = TimerDiff($a)

MsgBox(4096, Default, "+1: " & $d & @CRLF & "*2: " & $e)

Я что-то код не понял.. c*2 - это что??? Почему там сравнение идет с результатом работы таймера при с+1?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Первый вариант показывает сколько времени надо потратить, чтобы изменить размер массива с 1 до 10002, прибавляя каждый раз по 1 к размеру массива. Получается: 1, 2, 3, ..., 10001, 10002

Второй вариант показывает сколько времени надо потратить, чтобы изменить размер массива с 1 до 10001 (небольшая ошибочка, надо было написать ReDim $c[$b + 2]), удваивая размер массива каждый раз. Получается: 1, 2, 4, 8, 16, 32, 64, 128, ..., 8192, 16384, 10001 (или 10002 после исправления).

В первом случае размер массива меняется 10001 раз.
Во втором случае размер массива меняется 15 раз.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вот еще метод работы с массивом, правда не знаю насколько быстрый :D:
Код:
Dim $aArr[10] = [22,12,45,78,52,67,'x',0,45,8]

$oArray = ObjCreate('System.Collections.ArrayList')
For $i = 0 To UBound($aArr) - 1
	$oArray.Add($aArr[$i])
Next
$iSearch = 52
ConsoleWrite('Индекс искомого элемента - [' & $oArray.LastIndexOf($iSearch) & ']' & @CRLF)

$sSearch = 'x'
ConsoleWrite('Индекс искомого элемента - [' & $oArray.LastIndexOf($sSearch) & ']' & @CRLF)

$oArray.Reverse()
ConsoleWrite('Индекс искомого элемента - [' & $oArray.LastIndexOf($sSearch) & ']' & @CRLF)
;~ ConsoleWrite('Индекс искомого элемента - [' & $oArray.IndexOf($oArray, 8) & ']' & @CRLF) ; выдает ерунду, со значениями отличными от '8' выдает ошибку =)))


Но ищет LastIndexOf элементы с конца, а IndexOf не хочет работать. Если нужно - можно сделать .Reverse() и порядок элементов массива сменится на обратный.
Остальное тут -
http://msdn.microsoft.com/ru-ru/library/system.collections.arraylist_members%28v=VS.90%29.aspx
 
Верх