Конференция "Начинающим" » странное поведение Case оператора в консольном приложении
 
  • Гена © (24.12.16 19:48) [0]
    Компилятор D7.

    в большом цикле выполнятся оператор Case

    всегда выполняется за ~150сек

    Randomize;
    for i := 0 to 2147483647 do begin
     case Random(20) of
      1:;
      .....
      20:;
     end;
    end;



    а если сместить чуть метки, примерно так:

    Randomize;
    for i := 0 to 2147483647 do begin
     case Random(20,40) of
      20:;
      .....
      40:;
     end;
    end;



    то такой код (с другим диапазоном меток) начинает выполняться быстрее,
    всегда ~90 сек.

    Причем данный эффект наблюдатся только в консольном приложении, в оконном два примера работают одинаково.

    Может есть опции компилятора для разной трансляции case?
  • kilkennycat © (24.12.16 20:01) [1]

    >  Random(20,40)

    я вот уже плохо помню, но разве это не RandomRange? которая немного не Random(20)
  • Гена © (24.12.16 20:10) [2]

    > kilkennycat ©   (24.12.16 20:01) [1]

    Это условно, писалось в посте от руки
  • Гена © (24.12.16 20:13) [3]
    У меня только одна бредовая идея приходит на ум из этих результатов.

    Что когда диапазон маленький те от 1..20 поиск нужного ключа идет перебором, а когда значения поболее от 20..40, то поиск ключа идет бинарным поиском.
  • Inovet © (24.12.16 20:22) [4]
    Уверен, что распределение равномерное в 0-20 и в 20-40. А у тебя разное количество меток к тому же, т.е. в первом случае каждое 20 значение не попадает ни на одну метку.
  • Гена © (24.12.16 20:26) [5]

    > Уверен, что распределение равномерное в 0-20 и в 20-40

    на 100%, я просто нумерацию начал не с 0, а с 20, а в метках код остался прежним.
  • kilkennycat © (24.12.16 20:29) [6]

    > Гена ©   (24.12.16 20:10) [2]
    > Это условно, писалось в посте от руки

    ну круто, чё. меряешь время-то неусловно, вопрос задаешь неусловно, а что меряешь, какой код - условно.

    >  а когда значения поболее от 20..40,

    о возникает вопрос, как сделал от 20. если RandomRange, то это уже модуль Math

    а вообще, дизасм в помощь.
  • Гена © (24.12.16 20:55) [7]

    > а вообще, дизасм в помощь.

    Это б если я был умный а не учился на первом курсе.

    Вобщем, кому интересно напишите в чем же дело.

    Беру, просто перетосовую беспорядочно метки в Case т.е. не по порядку от 1..20,
    а 20,5,3,17 итд и результат выполнения становиться быстрей т.е те же ~90 сек второго примера, а не ~150 как если бы метки ишли по порядку.

    Получается компилятор генерирует разный код.
  • Гена © (24.12.16 21:02) [8]
    А и еще один прикол: догружаю case кучей пустых меток вида 100:; те варианты выбора которые несут нагрузку (как помните их 20 шт) разбрасываю среди этих вариантов и опять ~90, хотя казалось бы вариантов стало в 5 раз больше и работать должно в 5 раз медленнее, а работает наоборот быстрее.

    Наверно точно в одном случая компилятор принимает решение искать метки перебором, а когда их больше - бинарным поиском
  • Тимохов Дима © (24.12.16 22:15) [9]

    > Гена ©   (24.12.16 19:48) 


    С кейсом много чюдесов.
    Объяснить тебе смогут все деталях только те, кто разбирается в асме.
    Я, к сожалению, не разбираюсь...
  • Rouse_ © (25.12.16 00:07) [10]
    Смотря какой case, маленький джампами организован, большой через датамап, тут лучше асм листинг смотреть, у меня такого поведения не воспроизвелось
  • Гена © (25.12.16 00:18) [11]

    >  у меня такого поведения не воспроизвелось

    Так только в консоли, в оконных "не балуется"
  • Rouse_ © (25.12.16 01:49) [12]
    Экзешники архивом выложи, завтра или в пн гляну под IDA что там у тебя чудит, желательно с map файлами
  • NoUser © (25.12.16 01:54) [13]

    > Это б если я был умный а не учился на первом курсе.

    )))

    вот-вот, универы нынче зло!

    Ставишь точку останова (BreakPoint) , потом Ctrl+Alt+D, потом смотришь асм сам и нам показываешь.
  • Германн © (25.12.16 02:01) [14]

    > Гена ©   (25.12.16 00:18) [11]
    >
    >
    > >  у меня такого поведения не воспроизвелось
    >
    > Так только в консоли, в оконных "не балуется"
    >

    Не вижу разницы для компилятора в этих случаях.
    Разница может быть только в настройках конкретных проектов.
  • Rouse_ © (25.12.16 11:38) [15]

    > Германн ©   (25.12.16 02:01) [14]
    > Не вижу разницы для компилятора в этих случаях.
    > Разница может быть только в настройках конкретных проектов.

    Вот я бы небыл столь категоричен, знаешь сколько раз я уже натыкался на глюки компилятора? Вполне возможно что это один из таких вариантов.
    (Хотя, D7 - блин только обратил внимание, я то на берлине проверял)
  • kilkennycat © (25.12.16 14:10) [16]

    > глюки компилятора

    необязательно глюки. вот компиль xc8 иногда один и тот же код какой-то функции оптимизирует по-разному, только из-за того, что где-то совершенно далеко изменился размер переменной, которая к этой функции и отношения-то прямого не имеет. Мне так вместо простейшего сдвига такую хренотень замутил, что я не сразу-то и понял, че творится. При этом всё работает, конечно. Правда, не так :)
  • Тимохов Дима © (25.12.16 16:45) [17]

    > Rouse_ ©   (25.12.16 00:07) [10]
    > Смотря какой case, маленький джампами организован, большой
    > через датамап, тут лучше асм листинг смотреть, у меня такого
    > поведения не воспроизвелось


    Розыч, а у меня воспроизвелось. Только наоборот: у меня другие рандомы, правда (не думаю, что важно). Разница во времени процентов 20-30%. Чудеса.
  • Rouse_ © (25.12.16 20:13) [18]

    > Тимохов Дима ©   (25.12.16 16:45) [17]
    > Розыч, а у меня воспроизвелось. Только наоборот: у меня
    > другие рандомы, правда (не думаю, что важно). Разница во
    > времени процентов 20-30%. Чудеса.

    Ну скинь свой вариант, у меня оба варианта кода за 5 секунд (5.7) проходят.
    Я специально семерку с образа поднял и протестил именно в консоли.
  • Rouse_ © (25.12.16 20:24) [19]

    > kilkennycat ©   (25.12.16 14:10) [16]
    >  Мне так вместо простейшего сдвига такую хренотень замутил,
    >  что я не сразу-то и понял, че творится. При этом всё работает,
    >  конечно. Правда, не так :)

    Это скорее всего как раз прыжок через датамап (а вот с ним могут быть чудеса - на 2005 гарантированно воспроизводился один из вариантов, пока не пофиксили).
    На кодецентрале там даже большое обсуждение было.
 
Конференция "Начинающим" » странное поведение Case оператора в консольном приложении
Есть новые Нет новых   [118653   +10][b:0][p:0.001]