- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 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_;
};
Ccik 13.03.2013 08:50 # +1
defecate-plusplus 13.03.2013 09:32 # +4
где скип пробелов?
Abbath 13.03.2013 10:59 # 0
bormand 13.03.2013 13:50 # +1
Yuuri 13.03.2013 10:33 # +3
defecate-plusplus 13.03.2013 10:37 # +1
Lowezar 13.03.2013 10:35 # +3
someone 13.03.2013 10:45 # +3
И да, чем istringstream не угодил? Или хотя бы sscanf? Что за крохоборство? Преждевременная оптимизация - корень всех зол, если будет узкое место именно в чтении строк - вот тогда и оптимизируйте.
govnomonad 13.03.2013 11:13 # +2
Глядя на раздел C++, думаю что надо ввести ещё один раздел - C с классами.
defecate-plusplus 13.03.2013 11:33 # 0
someone 13.03.2013 21:23 # 0
bormand 13.03.2013 21:34 # +2
defecate-plusplus 13.03.2013 11:32 # +2
всё же разница не в 100 раз :)
к слову - результаты на -O0 тоже интересны (та же ссылка, $2)
LispGovno 13.03.2013 11:52 # 0
> boost::lexical_cast : 238 milliseconds
Я был о алекс касте лучшего мнения
myaut 13.03.2013 11:42 # 0
> 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
myaut 13.03.2013 12:42 # 0
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
TarasB 13.03.2013 15:45 # +2
bormand 13.03.2013 16:54 # +3
3.14159265 13.03.2013 21:04 # +3
atoi - как раз в стиле Тараса. Не бросает исключений, в каких-либо классах не состояла.
myaut 13.03.2013 21:08 # 0
Последнее еще умеет разделители тысяч, что естественно ведет к необходимости циклов