Автор Тема: Очень простой цикл  (Прочитано 55472 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #105 : Июнь 07, 2012, 11:18:10 am »
A1  3.04 seconds
A2  5.60 seconds
A3  5.60 seconds
A4  6.79 seconds
A1 либо не будет работать на самой популярной процессорной архитектуре, либо будет работать медленно (если jit-компилятор достаточно умен, чтобы сделать дополнительное побайтовое копирование во временную переменную).

Про A4… Предвижу контраргумент от info21, точнее даже два:
1) Зато оно пишется автоматом и гарантированно корректно.
2) Оптимизации зло! Все зло от оптимизаций!
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #106 : Июнь 07, 2012, 11:19:45 am »
(авторская чокнутая вспомогательная переменная oneZero оставлена)
А почему чокнутая?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #107 : Июнь 07, 2012, 11:48:00 am »
Формулировать и подсказывать инвариант цикла я не буду. Предлагаю это сделать участникам соревнований. Уже 3 года как.
Чтобы потом не было упреков выложил здесь запароленные инварианты.
Надо отметить, что простота вопроса просто смехотворная, и он не заслуживает таких извратов.
Но раз пошла такая пьянка...

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #108 : Июнь 07, 2012, 12:14:33 pm »
A1 либо не будет работать на самой популярной процессорной архитектуре, либо будет работать медленно (если jit-компилятор достаточно умен, чтобы сделать дополнительное побайтовое копирование во временную переменную).
На x64 работает. И быстрее всех. Ты о какой архитектуре?
А почему чокнутая?
Потому что костыль.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #109 : Июнь 07, 2012, 12:16:40 pm »
Итого:
A1  3.04 seconds
A2  5.60 seconds
A3  5.60 seconds
A4  6.79 seconds
То есть, получается, что второй и третий варианты с точки зрения производительности одинаковы? Тогда однозначно стоит выбрать более наглядный - третий.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #110 : Июнь 07, 2012, 12:20:25 pm »
На x64 работает. И быстрее всех. Ты о какой архитектуре?
На самой популярной. И это не .NET : )

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #111 : Июнь 07, 2012, 12:22:36 pm »
Померил скорость работы 4 разных алгоритмов.

Сергей - не затруднит, в варианте с "двойной проверкой" раскрыть  условие по правилу де Моргана? (что бы гарантированно сработало укороченное вычисление логических выражений)?

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #112 : Июнь 07, 2012, 12:23:58 pm »
А2 и А3 оказались равными на суперскалярном i7 2600 в 64 разрядной программе. Возможно на каком-то древнем процессоре выполняющем 1 инструкцию за такт А2 окажется быстрее чем А3.

А3 конечно лидер по понятности.

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #113 : Июнь 07, 2012, 12:28:00 pm »
Просто, сделайте а? считайте что личная просьба, ПОЖАЛУЙСТА.  :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #114 : Июнь 07, 2012, 12:28:27 pm »
Имхо, вариант А2 вполне понятен и прост...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #115 : Июнь 07, 2012, 12:30:10 pm »
Сергей - не затруднит, в варианте с "двойной проверкой" раскрыть  условие по правилу де Моргана? (что бы гарантированно сработало укороченное вычисление логических выражений)?
Оператор && в C# как раз и обозначает укороченное вычисление (второй операнд не вычисляется при ложности первого).

Название "двойная проверка" относится к тому, что теоретически можно делать шаг +2 вместо +1 если вторая буква не ноль. Но как это сделать практически мне не очевидно, а напрягаться и думать мне лень :)

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #116 : Июнь 07, 2012, 12:31:01 pm »
Имхо, вариант А2 вполне понятен и прост...
По мне так A3 (правда свои "какашки" ближе к "телу")  :D

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #117 : Июнь 07, 2012, 12:33:55 pm »
Но как это сделать практически мне не очевидно, а напрягаться и думать мне лень :)
убрать отрицание(! знак) по правилу де Моргана(мне интересен уровень оптимизации C#)

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #118 : Июнь 07, 2012, 12:34:54 pm »
Если в А3 заменить укороченное логическое && в побитовое & то вместо 5.60 секунд будет 8.28 секунд.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #119 : Июнь 07, 2012, 12:37:05 pm »
убрать отрицание(! знак) по правилу де Моргана(мне интересен уровень оптимизации C#)
Я про переход на 2 позиции вместо 1 при ненулевой второй букве.