1. C++ / Говнокод #12736

    +28

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    class atoi_func
    {
    public:
        atoi_func(): value_() {}
    
        inline int value() const { return value_; }
    
        inline bool operator() (const char *str, size_t len)
        {
            value_ = 0;
            int sign = 1;
            if (str[0] == '-') { // handle negative
                sign = -1;
                ++str;
                --len;
            }
    
            switch (len) { // handle up to 10 digits, assume we're 32-bit
                case 10:    value_ += (str[len-10] - '0') * 1000000000;
                case  9:    value_ += (str[len- 9] - '0') * 100000000;
                case  8:    value_ += (str[len- 8] - '0') * 10000000;
                case  7:    value_ += (str[len- 7] - '0') * 1000000;
                case  6:    value_ += (str[len- 6] - '0') * 100000;
                case  5:    value_ += (str[len- 5] - '0') * 10000;
                case  4:    value_ += (str[len- 4] - '0') * 1000;
                case  3:    value_ += (str[len- 3] - '0') * 100;
                case  2:    value_ += (str[len- 2] - '0') * 10;
                case  1:    value_ += (str[len- 1] - '0');
                    value_ *= sign;
                    return value_ > 0;
                default:
                    return false;
            }
        }
    private:
        int value_;
    };

    standard atoi()
    79142 milliseconds

    class atoi_func
    131 milliseconds.

    Если приходится велосипедить стандартные функции, то это камень в огород С++. Видать кресты писали гении ассемблерной оптимизации.

    Запостил: LispGovno, 13 Марта 2013

    Комментарии (20) RSS

    • факинг шит
      Ответить
    • ага, а где проверки, что символ - цифра?
      где скип пробелов?
      Ответить
    • atoi — это C. C++ — это istringstream::operator>>(int &i).
      Ответить
    • Сколько-сколько миллисекунд?! :-/ Или это сумма за 10000000000000000000000000000 прогонов?
      Ответить
    • Ман по atoi, как и ман по gets, должен включать предупреждение жирными буквами: никогда не используйте эту функцию!

      И да, чем istringstream не угодил? Или хотя бы sscanf? Что за крохоборство? Преждевременная оптимизация - корень всех зол, если будет узкое место именно в чтении строк - вот тогда и оптимизируйте.
      Ответить
      • Ещё же есть boost::lexical_cast

        Глядя на раздел C++, думаю что надо ввести ещё один раздел - C с классами.
        Ответить
      • чем опасен atoi, кроме того, что при переполнении численного результата он всего лишь undefined?
        Ответить
        • У atoi нет нормального способа сигнализировать об ошибке, в отличие от strtol. Возврат 0 может означать как ошибку, так и честно прочитанный ноль.
          Ответить
          • В некоторых случаях на это пофиг. Напримен если ноль сам по себе является недопустимым значением.
            Ответить
    • http://liveworkspace.org/code/1ekr4l$1
      всё же разница не в 100 раз :)

      к слову - результаты на -O0 тоже интересны (та же ссылка, $2)
      Ответить
      • > atoi_func (size) : 24 milliseconds, result: -1475144800103
        > boost::lexical_cast : 238 milliseconds
        Я был о алекс касте лучшего мнения
        Ответить
    • > standard atoi()
      > 79142 milliseconds
      Может все же 30 микросекунд? А то в 80 секунд как-то не особо верится ;)

      У меня получились такие результаты:
      Без оптимизации
      Time for null: 1.417420us
      Time for libc atoi: 5.278074us
      Time for strtol atoi: 3.331467us
      Time for govnokod atoi: 3.729697us

      С -O2
      Time for null: 0.250712us
      Time for libc atoi: 3.582146us
      Time for strtol atoi: 3.126788us
      Time for govnokod atoi: 2.111855us
      Ответить
      • С временами напутал:
        Time for null: 0.016275us
        Time for libc atoi: 0.079585us
        Time for strtol atoi: 0.033201us
        Time for govnokod atoi: 0.039701us

        С -O2:
        Time for null: 0.002507us
        Time for libc atoi: 0.046500us
        Time for strtol atoi: 0.047190us
        Time for govnokod atoi: 0.019531us
        Ответить
        • Всё-таки говнокодовское более чем вдвое быстрее(
          Ответить
          • Правильно, ведь оно умеет только десятичную систему счисления.
            Ответить
            • И тем не менее все плюсуют сей duff bicycle device.
              atoi - как раз в стиле Тараса. Не бросает исключений, в каких-либо классах не состояла.
              Ответить
            • Посмотрел в исходники libc atoi - обертка над strtol.
              Последнее еще умеет разделители тысяч, что естественно ведет к необходимости циклов
              Ответить

    Добавить комментарий