перебор символов(DELPHI)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by qwerty001, 5 Apr 2010.

  1. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    правильно, потому что 1=1 сравниваются константы
    компилятор такие вещи вычисляет заранее

    кстати, AlexTheC0d3r советую для таких вещей установить себе профайлер чтобы каждый раз не мучаться с настройкой велика - GProfile

    Намного хуже когда я вижу такой код:
    if Button1.Enabled = True then ...
     
    #21 GhostOnline, 6 Apr 2010
    Last edited: 6 Apr 2010
  2. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Да, это тоже лол:)

    Эт я тоже давно читал примеры говнокода и вот до сих пор вспоминаю код :

    if Length(IntToStr(number)) = 1 then
    {один разряд у числа} else { не один }

    или
    if true then
    {что то делаем} else {а дальше сплошной профит}

    Такие мастера находятся:))
     
    #22 Jingo Bo, 6 Apr 2010
    Last edited: 6 Apr 2010
  3. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Потестил код, короче с true как ни крути выигрывает, 672ms, при 1=1 686ms. Но в отладчике код одинаков, то есть ни там ни там нет проверки, но разница есть, во всём виноваты массоны:))
     
  4. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Новый тест, без оптимизации...
    Действительно, как бы не парадоксально это выглядело, но
    PHP:
    while true do
    проигрывает по скорости коду ->
    PHP:
    while 1=do
    Также можно заметить, что добавление в условие цикла сторонних вычислений во много раз замедляет его работу, вот доказательства:

    PHP:
    {$OPTIMIZATION OFF}
    program TestCycleDuration;

    {
    $APPTYPE CONSOLE}

    uses
      SysUtils
    DateUtils;
    var
      
    iinteger;
      
    timeStarttimeEndTDateTime;
      
    firstRessecondResthirdResstring;

    begin
      Writeln
    ('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('First test, cycle "while true do"');
      
    Writeln('Testing...');
      
    := 0;
      
    timeStart := now;
      while 
    True do
      
    begin
        i 
    := 1;
        if 
    2000000000 then
          
    Break;
      
    end;
      
    timeEnd := Now;
      
    Writeln('Test duration: ' inttostr(MilliSecondsBetween(timeEndtimeStart))
        +
        
    'ms');
      
    firstRes := inttostr(MilliSecondsBetween(timeEndtimeStart));
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('Second test, cycle "while 1=1 do"');
      
    Writeln('Testing...');
      
    := 0;
      
    timeStart := now;
      while 
    do
      
    begin
        i 
    := 1;
        if 
    2000000000 then
          
    Break;
      
    end;
      
    timeEnd := Now;
      
    Writeln('Test duration: ' inttostr(MilliSecondsBetween(timeEndtimeStart))
        +
        
    'ms');
      
    secondRes := inttostr(MilliSecondsBetween(timeEndtimeStart));
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('Tird test, moron'#39's cycle "while StrToInt(1)=StrToInt(1) do"');
      
    Writeln('Testing...');
      
    := 0;
      
    timeStart := now;
      while 
    StrToInt('1') = StrToInt('1') do
      
    begin
        i 
    := 1;
        if 
    2000000000 then
          
    Break;
      
    end;
      
    timeEnd := Now;
      
    Writeln('Test duration: ' inttostr(MilliSecondsBetween(timeEndtimeStart))
        +
        
    'ms');
      
    thirdRes := inttostr(MilliSecondsBetween(timeEndtimeStart));
      
    WriteLn('Two tests: 1: ' firstRes 'ms' ' 2: ' secondRes 'ms' ' 3:'
        
    thirdRes 'ms');
      
    Readln;
    end.
    Результаты: 1- 4812ms 2-4750ms 3-36265ms
     
  5. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    Один раз было, что True на 10 мс быстрее выполнилось чем 1=1:

    1: 3859ms 2: 3844ms 3: 91609ms
    1: 4249ms 2: 4000ms 3: 92421ms

    P.s. 3 метод просто убивает :)
     
    1 person likes this.
  6. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Дак там и написано идиотский тест)
     
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Хватит гадать, в обоих случаях константные выражения.
    Точная скорость выполнения зависит от слишком многих факторов
     
  8. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0


    объясните пожалуйста почему когда использую этот код и подключаю icqclient, то код рожает совсем другие символы?
     
  9. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    всё, разобрался. но возникла другая проблема. по коду Jingo Bo, если брать словарь 79 символов и переменную int64, то перебор возможен до ~7(длина пароля) символов, потом всё по новой переберает. =\
     
    #29 qwerty001, 8 Apr 2010
    Last edited: 8 Apr 2010