0xd34df00d 17.01.2013 13:43 Azoth_primary

А еще, похоже, мне пора начать обмазываться даташитами на процессоры и все такое.
По крайней мере, похоже, для вещи типа
char ch = ...
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
something = true;
gcc генерит жутко неоптимальный код из кучи cmp/jz, которые сбивают нахер бранч предиктор.

В результате избавления от этого условия ускорил функцию в два раза, например.

Recommended by:

@pooq: моча съела говно

1. Myp 17.01.2013 13:45 Work

Жаваебы смотрят с недоумением и крутят у виска пальцем

2. generatorglukoff 17.01.2013 13:45 Воркота

-O3 ?

3. 0xd34df00dgeneratorglukoff /2 17.01.2013 13:45 Azoth_primary

Да.

4. DZhon 17.01.2013 13:47 Miranda

Ынжой ё предикшн: http://igoro.com/archive/fast-and-slow-i...

5. 0xd34df00dDZhon /4 17.01.2013 13:48 Azoth_primary

Соснули все.

6. DZhon0xd34df00d /5 17.01.2013 13:49 Miranda

Именно. Твои условия для предиктора — это нечто заоблачное.

7. cirno 17.01.2013 13:51 Lambdadelta

Боль байтоукладчиков.

8. 0xd34df00dcirno /7 17.01.2013 13:51 Azoth_primary

Я не байтоукладчик, а у мамы хайперф-погромизд.

9. cirno0xd34df00d /8 17.01.2013 13:51 Lambdadelta

5k rps?

10. DZhonMyp /1 17.01.2013 13:51 Miranda

Ну и как жава от этого не будет страдать?

11. 0xd34df00dcirno /9 17.01.2013 13:51 Azoth_primary

Больше.

12. cirnoDZhon /10 17.01.2013 13:52 Lambdadelta

Жаваёбы не страдают, они переводят тикеты.

13. 0xd34df00dDZhon /10 17.01.2013 13:52 Azoth_primary

Прозреваю, это он про то, что им со всеми их абстрактными прокси-фасад-фабриками на такие мелочи тупо похуй.

14. cirno0xd34df00d /11 17.01.2013 13:52 Lambdadelta

Я уже потекла.

15. 0xd34df00dcirno /14 17.01.2013 13:52 Azoth_primary

Правда, никто не знает, нахуя нам столько, ибо в реальной жизни запросов куда меньше, но мы все равно делаем все оптимально, А ТО ВДРУГ ЗАПРОСЫ.

16. DZhon0xd34df00d /13 17.01.2013 13:53 Miranda

Прозреваю типичный жавасофт с СЕРВЕРАМИ КЛАСТЕРАМИ МАСШТАБИРУЕМОСТЬЮ

17. cirnoDZhon /16 17.01.2013 13:54 Lambdadelta

И департаментом из сорока разработчиков в галстуках.

18. techpriest 17.01.2013 14:14 tkabber

А не проще будет написать "something = (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')"?

19. 0xd34df00dtechpriest /18 17.01.2013 14:15 Azoth_primary

Нет, потому что something в false выставляться не должен никогда.
Хотя можно, конечно, something = something || (...), но, похоже, компилятор генерит одно и то же для этих двух записей.

20. komar 17.01.2013 14:29 thinkpad

Ну ебать ты тупой. Переделай в свитч.

21. 0xd34df00dkomar /20 17.01.2013 14:29 Azoth_primary

Проиграл с подливой.

22. komar0xd34df00d /21 17.01.2013 14:30 thinkpad

Я не силен в крестах: гохацэ не умеет переделывать свитч по чару в один индайрект джамп?

23. 0xd34df00dkomar /22 17.01.2013 14:32 Azoth_primary

> кресты
> свитч по чару
Гм.

А по сути — хер его знает, я не силен в нутрах гцц.
И да, ты предлагаешь мне писать свитч с примерно 52 вариантами? Да ты ебнулся, и насколько я помню, компилятор достаточно длинные свитчи разворачивает в if'ы, а не джампы.
Кстати, если там будет cmp и conditional jump, хоть дайрект, хоть индайрект, предиктору все равно пизда.

24. DZhon0xd34df00d /23 17.01.2013 14:32 Miranda

Можно сгенерить препроцессором lookup table.

25. 0xd34df00dDZhon /24 17.01.2013 14:33 Azoth_primary

В роли препроцессора ghc, см. соседний тред.

26. komar0xd34df00d /23 17.01.2013 14:34 thinkpad

У меня нет Целостной Картины Мира, поэтому что такое «предиктор» я тоже не знаю. Если это важно — объясни.
> Да ты ебнулся, и насколько я помню, компилятор достаточно длинные свитчи разворачивает в if'ы, а не джампы.
Не вижу причин делать это в данном конкретном случае. Причины делать — вижу, куча.

27. 0xd34df00dkomar /26 17.01.2013 14:36 Azoth_primary

Это такая штука в процессоре, которая пытается предсказать результат какого-нибудь там условия и начать выполнять соответствующий код до того, как само условие будет проверено.
Например, в
bool foo = doSomething ();
if (foo)
doBar ();
можно попробовать начать выполнять doBar до того, как doSomething завершится и вернет foo. Если угадали — отлично, у нас уже и результат doBar почти что есть, если не угадали — ну, не повезло, ничего не потеряли, кроме пары пикоджоулей на вычисления.

> Не вижу причин делать это в данном конкретном случае. Причины делать — вижу, куча.
Parse failed.

28. 0xd34df00d0xd34df00d /27 17.01.2013 14:36 Azoth_primary

В примере лучше, конечно, напиметь if (foo) doBar1 (); else doBar2 ();, тогда понятнее, чо зачем.

29. komar0xd34df00d /27 17.01.2013 14:50 thinkpad

Спасибо, понятно.
> Parse failed.
Я сейчас немного упорот, так что не судите сильно строго. Вдобавок я нихуя не эксперт, а быдло, которое ковырялось, когда ему было интересно.
В общем, поведение комплиятора мне кажется вполне адекватным. Ну, ты же сам пишешь — если, больше или равно, бла-бла-бла. Ебись, процессор, проверяй то и это. В теории компилятор может такую хуйню и оптимизировать, но это уже «прибери за хозяином» и «сделай то, не прошу что». Если ты хочешь, чтобы все это говно резолвилось одним ijmp’ом — тебе нужен свитч. Если нужен смешнй рассказ упоротого дебила о том, как работают ijmp’ы — реквестируй.
Ну так вот. Беда свитча в том, что тебе придется писать несколько десятков вариантов чаров, а это нихуя не весело. Но проблема только в том, что дохуяписать.
Для такого случая в языке должен быть сахар в виде рейнджей. Даже в сраном окамле он есть: http://caml.inria.fr/pub/docs/manual-oca...
Уверен, что и для сраных плюсцов его изобрели. Поищи там.

30. 0xd34df00dkomar /29 17.01.2013 14:52 Azoth_primary

На самом деле, решение уже найдено.

31. komar0xd34df00d /30 17.01.2013 14:52 thinkpad

Да похуй мне. У тебя тут каноничный случай, когда надо делать свитчом. Делай, сука!!!11111

32. 0xd34df00dkomar /31 17.01.2013 14:53 Azoth_primary

Поехавший.

33. komar0xd34df00d /32 17.01.2013 14:56 thinkpad

Все, пора идти домой.

34. 0xd34df00dkomar /33 17.01.2013 14:57 Azoth_primary

Пошедший.

35. techpriestkomar /31 17.01.2013 14:58 tkabber

Нафиг ты ему советы даешь?

36. 0xd34df00dtechpriest /35 17.01.2013 14:58 Azoth_primary

А почему бы и нет?

37. komartechpriest /35 17.01.2013 14:58 thinkpad

А что такого?

38. techpriest0xd34df00d /36 17.01.2013 14:59 tkabber

Так дедфуд же. Он все равно сделает по своему, а ты потом окажешься виноват, что у него говно получилось.

39. 0xd34df00dtechpriest /38 17.01.2013 14:59 Azoth_primary

Не, мне там хирсворк/гиниратырь в соседнем треде норм посоветовали, попробую сделать, как они посоветовали, да.

40. octocatcirno /17 17.01.2013 15:53

Ога, сам видел.

41. ulidtkoDZhon /24 17.01.2013 17:03

можно (это будет оптимально по скорости), но зачем?
http://en.cppreference.com/w/c/string/by...

42. DZhonulidtko /41 17.01.2013 17:20

Затем, что дедфудотред же ;]

43. ulidtkoDZhon /42 17.01.2013 17:35

ага, точно.

кажется, сейчас спалю концепцию дедфудотреда: весь тред мудаки-плюсоёбы отсасывают у своего основного источника несвежего говнеца тем способом, что под конец постоянно понимают, что в очередной раз у него отсосали.

нахуй быть плюсоебом, короче

44. 0xd34df00dulidtko /43 17.01.2013 17:44 Azoth_primary

А мне норм.

Do you really want to delete ?