Что быстрее TStringList или Copy

artzub
Дата: 06.07.2009 07:55:51
Привет всем!!!
Такой вот вопрос меня волнует:

1. есть метод Split
function Split (const S: String; Separator: 
     String; MyStringList: TStringList = nil) : TStringList;
var
    Start: integer;
    wantCount : Integer;
begin
   Result := TStringList.Create();
   if Assigned(MyStringList) then
        Result.AddStrings(MyStringList);
   Start := 0;
   while Start <= Length(S) do
        Result.Add(GetNextToken(S, Separator, Start)) ;
end;
function GetNextToken (S: string; Separator: 
    String; var StartPos: integer): String;
var 
    Index: integer;
begin
    Result := '';

    if StartPos > length(S) then
        Exit;

    S := Copy(S, StartPos + 1, length(S));
    Index := pos(Separator, S);

    if Index = 0 then
        Index := length(S)
    else
        Index := Index - 1;

    Result := Copy(S, 0, Index);
    
    StartPos := StartPos + Index + 1;
end;
2. следующие:
var
    curFile : TstringList;
    curLine : TStirngList;
    curIndex : array[0..10] of integer;
begin
    curFile := TStirngList.Create();
    try
        curFile.LoadeFromFile('1.txt');
        for i = 0 to curFile.Count - 1 do
        begin
            curLine := Split(curFile[i], ';');
            try
                for j = 0 to Params.Count - 1 do
                begin
                    case j of
                        0, 1, 3 :
                            if curIndex[j] < curLine.Count - 1 then
                                Params[j].AsString := curLine[curIndex[j]];
                        ...
                        
                    end;
                end;
            finally
                FreeAndNil(curLine);
            end;
        end;
    finally
        FreeAndNil(curFile);
    end;
end;

Не будет ли быстрей переделать так чтоб использовать метод Copy?

допустим так:
function GetDataToIndex(inStr : String; index : 
    integer; delimiter : string) : string;
var 
    i : integer;
begin
    Result := '';
    while (inStr <> '') and 
          (pos(delimiter, inStr) > 0) do
    begin
        Result := copy(inStr, 0, pos(delimiter, inStr) - 1);
        if i = index then
            exit;
        inStr := copy(inStr, pos(delimiter, inStr) + 1, Length(inStr));
    end;
end;
и естественно использовать вот так:
var
    curFile : TstringList;
    curIndex : array[0..10] of integer;
begin
    curFile := TStirngList.Create();
    try
        curFile.LoadeFromFile('1.txt');
        for i = 0 to curFile.Count - 1 do
        begin
            for j = 0 to Params.Count - 1 do
            begin
                case j of
                    0, 1, 3 :
                        if curIndex[j] < curLine.Count - 1 then
                            Params[j].AsString := 
                                  GetDataToIndex(curFile[i], curIndex[j], ';');
                    ...
                    
                end;
            end;
        end;
    finally
        FreeAndNil(curFile);
    end;
end;
____________________________________________________________________________________
Жизнь хитрая штука - как только все карты на руках — она решает сыграть с тобой в шахматы!
DimaBr
Дата: 06.07.2009 08:30:48
Что же мешает запустинь на миллиот итераций оба метода и посмотреть, какой работает быстрее
artzub
Дата: 06.07.2009 08:35:32
Вот этим и занят! =)
____________________________________________________________________________________
Жизнь хитрая штука - как только все карты на руках — она решает сыграть с тобой в шахматы!
sined
Дата: 06.07.2009 12:03:06
Определитесь действительно ли вам так важна оптимизации этого кода . Пока у вас ни тот ни другой вариант не оптимальны . Проблема в том что в обеих вариантах вы активно нарезаете строки , это лишние операции распределения памяти . Для работы с текстом если объемы данных велики и скорость критична лучше подойдет тип pChar.
artzub
Дата: 06.07.2009 14:05:46
вообще после 4 часового теста получены следующие результаты =)

вариант когда используется TStringList
Импорт данных;выполнено;Импортировано: 338580, Пропущено: 0.Всего: 338580
Время работы: 02:03:08:516

Вариант когда используется Copy
Импорт данных;выполнено;Импортировано: 338580, Пропущено: 0.Всего: 338580
Время работы: 02:01:17:782;;

____________________________________________________________________________________
Жизнь хитрая штука - как только все карты на руках — она решает сыграть с тобой в шахматы!
sqllex
Дата: 06.07.2009 15:44:17
Здается мне этот тест ничего не показал. Вы строки в базу импортировали, что-ли? Так у вас время записи в БД гораздо больше времени обработки строки, поэтому вам абсолютно все равно как делать разбор :)
crt
Дата: 06.07.2009 16:26:07
попробуй тоже самое но c ф-цией PosEx
artzub
Дата: 07.07.2009 11:33:42
По любому pos и copy будут быстрее чем PosEx так как они на asm реализованы, ну может быть конечно компилятор и представить код который представлен в posex в похожей на pos но мне как-то надежней использовать уже asm функцию!! =)
____________________________________________________________________________________
Жизнь хитрая штука - как только все карты на руках — она решает сыграть с тобой в шахматы!
artzub
Дата: 07.07.2009 11:34:25
sqllex
Здается мне этот тест ничего не показал. Вы строки в базу импортировали, что-ли? Так у вас время записи в БД гораздо больше времени обработки строки, поэтому вам абсолютно все равно как делать разбор :)


Вы меня раскусили и успокоили =)