Блог пользователя eduardische

Автор eduardische, 11 лет назад, По-русски

Недавно наткнулся на другой способ оценивания программ по спортивному программированию — вместо лимита по времени используя количество инструкций ассемблерного кода, который выполняет процессор. Причём, наткнулся в первый раз, до этого нигде такую систему не встречая.

Поэтому очень интересуют мнения, какие преимущества и недостатки имеются у такого метода. С первого взгляда имеется огромное преимущество в связи с тем, что количество инструкций не зависит от производительности компьютера. Огромных недостатков, на первый взгляд я не обнаружил, но так как сталкиваюсь с этим впервые, хотелось бы услышать мнения сообщества по этому поводу. Может быть кто-нибудь уже имел дело с этих подходом.

Заранее спасибо!

  • Проголосовать: нравится
  • +34
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Недостаток в том, что инструкции бывают разные. От сложения целых чисел, до деления long double и выделения 700 мб памяти. Можно ссылку на такую интересную систему?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Очень хорошее наблюдение, это, считаю, самый главный и очень существенный недостаток — ведь разные инструкции занимают разное время и выполняют разный объём работы.

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Я вижу такие минусы:

  • Этот метод всё равно подвержен неточностям, поскольку зависит от компилятора/его параметров/библиотек
  • Участник не может легко взять и оценить количество затраченных инструкций локально у себя на компьютере

Плюсов, кроме упомянутых, сразу не вижу.

»
11 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится

Я бы отнёс к недостаткам:

  1. Совершенно разные наборы инструкций на разных процессорах. Например, современные имеют команды для работаты с векторами.

  2. Не учитываются такие важные вещи, как промахи/попадания в кэш (и, соответственно, скорость работы памяти), конвеер (когда несколько независимых инструкций выполняются параллельно) и, наверняка, что-то еще. Мне кажется, что это еще больше отдаляет олимпиады от реального программирования — время работы и количество выполненных операций совершенно не коррелируют.

  3. Не очень понятно, как точно мерять.

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Не хочу никого обидеть, но мне кажется что это глупый и надуманный способ сравнения по количеству инструкций у программы в ассемблерном коде. Одно дело, когда ты говоришь: "моя программа работает менее двух секунд на Pentium IV 2 Ггц" — такую фразу поймет практически любой пользователь ПК. А если мне кто-то скажет, что его программа делает 124354365 инструкций — это уже будет тяжеловато понять. Тем более объяснить человеку, далекому от СП.

»
11 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Уводя вопрос немного в оффтопик: а как посчитать, сколько инструкций данной конкретной программы и только ее выполнил процессор?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Разработчик системы сказал, что для этого он использовал valgrind.

»
11 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Defect: Commonly used compilers are designed for optimising code for existing architectures. So...