0xd34df00d 13.03.2012 16:28 Azoth_primary

Господа, как быстрее, по-вашему, определить число цифр в числе — взять от него десятичный логарифм и округлить вверх или последовательно делить на десять, пока не упрусь в ноль?
Я просто слышал, что логарифм брать пипец как долго в известном смысле.

Recommended by:

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

1. magog 13.03.2012 16:28 Azoth

перевести в строку и выдать length?

2. generatorglukoff 13.03.2012 16:29 Воркота

число какое? если int быстрее тупо двоичным поиском

4. 0xd34df00dmagog /1 13.03.2012 16:29 Azoth_primary

Пиздец.

6. 0xd34df00dlHooFool /3 13.03.2012 16:29 Azoth_primary

Еще один пизедц.

7. magog0xd34df00d /6 13.03.2012 16:30 Azoth

чем пиздец ты можешь объяснить?

8. nobodyzzz 13.03.2012 16:30

а если через log2 пересчитать — его ж быстро брать

10. 0xd34df00dmagog /7 13.03.2012 16:30 Azoth_primary

Переводить в строку число — это пиздец.

11. e1coyot 13.03.2012 16:30 AzothBDED69EF

Ты глупый штоле? Берешь и считаешь: раз, два, три, четыре... Дошел до конца — все, до скольки досчитал, столько и цифр.

12. 0xd34df00dlHooFool /9 13.03.2012 16:30 Azoth_primary

Я на хаскеле пишу, там что угодно в одну строку.

13. magog0xd34df00d /10 13.03.2012 16:30 Azoth

в плане затратности?

14. 0xd34df00de1coyot /11 13.03.2012 16:30 Azoth_primary

У меня не строка, а число.

15. 0xd34df00dmagog /13 13.03.2012 16:30 Azoth_primary

Да.

16. magog0xd34df00d /15 13.03.2012 16:30 Azoth

ok

17. 0xd34df00dnobodyzzz /8 13.03.2012 16:30 Azoth_primary

Хм, почему его быстрее, чем log_10 брать?

18. generatorglukoff 13.03.2012 16:30 Воркота

дедфуд, сука, -→ /2

20. 0xd34df00dgeneratorglukoff /18 13.03.2012 16:31 Azoth_primary

Хм. Разверни мысль.

21. asmer 13.03.2012 16:32 Psi+

переведи в строку и возьми от строки strlen :3. я думаю логарифм на сопроцессоре ок.

22. asmer 13.03.2012 16:32 Psi+

и вообще, напейши бенчмарк.

23. hirthwork 13.03.2012 16:32 mcabber8B83551D

я бы биномиально делил на степени десятки

25. 0xd34df00dhirthwork /23 13.03.2012 16:32 Azoth_primary

WTF биномиально?

26. nobodyzzz0xd34df00d /17 13.03.2012 16:32 workFF569F40

ну потомшто уоррен пишет что Число значащих бит — целая часть двоичного логарифма от самого числа. =)

27. generatorglukoff0xd34df00d /20 13.03.2012 16:33 Воркота

int ints[] = { 1, 10, 100, 1000, .... }
lower_bound(ints, ints + count, x) — ints + 1

28. e1coyot0xd34df00d /14 13.03.2012 16:33 AzothBDED69EF

Число так число, все равно считай. Карандашиком точечки можешь ставить над цифрами, чтобы не сбиться.

29. hirthworkhirthwork /23 13.03.2012 16:33 mcabber8B83551D

вернее даже не так, биномиально проверял на что больше или меньше степени десятки. вот

30. generatorglukoffgeneratorglukoff /27 13.03.2012 16:33 Воркота

std::lower_bound

31. 0xd34df00dgeneratorglukoff /27 13.03.2012 16:33 Azoth_primary

Э, чо?

32. hirthworkgeneratorglukoff /27 13.03.2012 16:33 mcabber8B83551D

во! именно так. хороший план

33. 0xd34df00dgeneratorglukoff /27 13.03.2012 16:33 Azoth_primary

Я не очень понял — ints

34. generatorglukoff0xd34df00d /33 13.03.2012 16:34 Воркота

название массива

35. 0xd34df00dgeneratorglukoff /34 13.03.2012 16:34 Azoth_primary

Я не могу искать бинарным поиском по [1,10,..], а там уже линейно. Хотя, подозреваю, это будет существенно быстрее и логарифма, и деления на 10. Спасибо за идею, клеви.

36. hirthwork0xd34df00d /33 13.03.2012 16:35 mcabber8B83551D

это степени десятки, ёпта. loverbound будет совпадать с минимальной степенью десятки, которая меньше твоего числа. берёшь std::distance и получаешь значение степени

37. 0xd34df00dhirthwork /36 13.03.2012 16:35 Azoth_primary

> loverbound
Оук.

Я не понял вычитание указателя из возвращаемого lower_bounds итератора, но похуй.

38. 0xd34df00dhirthwork /36 13.03.2012 16:35 Azoth_primary

И нет никаких дистансов. Лучше посчитаю глубину рекурсии, конпелятор все равно в цикл развернет ;3

39. hirthwork0xd34df00d /37 13.03.2012 16:36 mcabber8B83551D

вычитание = std::distance

40. generatorglukoff0xd34df00d /35 13.03.2012 16:36 Воркота

всё равно профильни, хуй его знает

41. asmer 13.03.2012 16:37 Psi+

кстати, я правильно помню, log2(n)/log2(10) = log10(n), если так, то надо найти тупо старший бит и его номер поделить на константу. имхо быстрее не придумаешь.

42. generatorglukoffasmer /41 13.03.2012 16:38 Воркота

>найти тупо старший бит и его номер поделить на константу. имхо быстрее не придумаешь.
127 и 65 имеют одинаковое число цифр, ага

43. diSabler 13.03.2012 16:38 tkabber

логарифм — красивое решение, но "тяжелое". деление — цикл, и это не Ъ. проще всего преобразовать в строку и взять длинну. имхо.

44. asmergeneratorglukoff /42 13.03.2012 16:39 Psi+

где-то тут проеб. ты прав. вот где?

45. generatorglukoffdiSabler /43 13.03.2012 16:39 Воркота

ахуеть, а как число в строку превращается? не делениями с остатком случайно??

46. asmergeneratorglukoff /45 13.03.2012 16:39 Psi+

нет, оно само.

47. asmerasmer /44 13.03.2012 16:41 Psi+

наверное он в том, что я логарифм округляю.

48. generatorglukoffasmer /47 13.03.2012 16:41 Воркота

ага. двоичный логарифм ты округляешь до целого

49. 0xd34df00dhirthwork /39 13.03.2012 16:47 Azoth_primary

Оук.

50. 0xd34df00dgeneratorglukoff /40 13.03.2012 16:47 Azoth_primary

Ваще пойду хоть что-то заимплемечну.

51. 0xd34df00dasmer /41 13.03.2012 16:47 Azoth_primary

О. А как нынче модно искать старший бит?

52. 0xd34df00dgeneratorglukoff /42 13.03.2012 16:48 Azoth_primary

Мне нужно оценить число сверху, желательно поточнее, чтобы не вылезло за 2^64. Если у 65 появится ВНЕЗАПНО три цифры, я переживу.

53. 0xd34df00ddiSabler /43 13.03.2012 16:49 Azoth_primary

Деление — рекурсия.
А если речь о строках, то я лучше буду исходно строками манипулировать. Мне нужно строить ID дерева по ID поддеревьев и ID операции, да.

54. asmer0xd34df00d /51 13.03.2012 16:49 Psi+

я хз, ассемблер забыл. а так в принципе смотри сверху пока байт 0, а потом уже сдвигом пока бит 0

55. 0xd34df00dasmer /54 13.03.2012 16:50 Azoth_primary

А у меня все равно асма тут нет, а с битовыми операциями в х-ле я еще не работал.

56. asmer0xd34df00d /55 13.03.2012 16:51 Psi+

я не говорю что писать это на асме. я говорю о тех вещах, которые быстро сработают в процессоре и при умном компилере.

57. generatorglukoff0xd34df00d /55 13.03.2012 16:51 Воркота

в хаскелле нет битовых операций? мб он деление на явные степени двойки соптимизирует хотябы?

58. asmerasmer /56 13.03.2012 16:51 Psi+

и я, к сожалению еще не осилил х-ль, посему не знаю что он умеет с числами.

59. 0xd34df00dgeneratorglukoff /57 13.03.2012 16:52 Azoth_primary

Должен, гохаце вообще умный. И битовые операции были, но мне еще и там мозг ломать не хватало, как искать старший бит.

60. 0xd34df00d 13.03.2012 16:55 Azoth_primary

А похую, сделаю ваще все на строках, а то от треда пахнет ПРЕЖДЕВРЕМЕННЫМИ ОПТИМИЗАЦИЯМИ.

61. asmer0xd34df00d /60 13.03.2012 16:56 Psi+

Ъ. и вообще, если это не критично, самый лучший код — это самый читаемый. Короче без лямбд и хаскеля.

62. generatorglukoff0xd34df00d /60 13.03.2012 16:57 Воркота

нет такой хуйни как "преждевременная оптимизация", если ленивые мозги и тормозное говно размазанное мелким слоем

63. 0xd34df00dasmer /61 13.03.2012 16:57 Azoth_primary

Как-то так толсто про хаскель, что даже тонко.

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

64. 0xd34df00dgeneratorglukoff /62 13.03.2012 16:57 Azoth_primary

Посмотрите, какой оптимизатор.

65. generatorglukoff0xd34df00d /64 13.03.2012 16:59 Воркота

когда у тебя тормозит в любой эпсилон окрестности — вот тогда ты будешь вспоминать и матюкаться о "преждевременных оптимизациях"

66. 0xd34df00dgeneratorglukoff /65 13.03.2012 17:00 Azoth_primary

Когда профайлер мне покажет, что в этом месте я 1% времени, я над тобой посмеюсь.

67. generatorglukoff0xd34df00d /66 13.03.2012 17:01 Воркота

смех без причины — признак психического заболевания

68. asmergeneratorglukoff /62 13.03.2012 17:02 Psi+

если тормозное говно размазано мелким слоем — надо менять компилятор и/или язык. А обычно тормозное говно концентрируется в бутылочном горлышке, там профайлер поможет.

69. generatorglukoffasmer /68 13.03.2012 17:03 Воркота

ну хаскель он не поменяет

70. 0xd34df00dasmer /68 13.03.2012 17:03 Azoth_primary

Да. У меня как-то раз 60% времени код жрал в лукапе функций по айдишникам. Заменил lookup по [(a, b)] на паттерн-матчинг, и все стало ваще заебись.

71. asmer0xd34df00d /63 13.03.2012 17:06 Psi+

не понял что конкретно ты делаешь с айдишниками. суммируешь низлежащие ноды? или как? впрочем хрен с ним, это надолго, меня ПЫХ ждет ;(

72. 0xd34df00dasmer /71 13.03.2012 17:08 Azoth_primary

Ну, я хотел домножать идентификатор нижележащей ноды на число цифр в нем и складывать с вышележащим. Правда, это все говно, похоже, и неоднозначно. Лучше поебу строки, да, а на алгоритме помечания сделаю отдельную публикацию :3

73. DZhon 13.03.2012 17:30

Быстрый логарифм тебя спасет.

#define LOG2E 1.44269504088896340736f

float fastLog2( float x )
{
ADVFLOAT ax;
int exp;

ax.x = x;
exp = ax.exp — 127;
ax.sign = 0;
ax.exp = 127;

return (ax.x — 1.0f) * LOG2E + exp;
}

74. kb 13.03.2012 17:44

если у тебя размер числа фиксирован (типа максимум 128 бит), то можно попробовать найти наибольший старший разряд (позицию) при помощи операций OR побитовых

вот я построил список 10**i степени

http://paste.pocoo.org/show/565203/

в большинстве случаев становится всё ясно, но когда количество разрядов одинаково можно делать cmp.

впрочем, может и cmp операция достаточно дешёвая на современных ЦПУ чтоб не выёбываться и делать таки двоичный поиск как кто-то уже сказал.

75. 0xd34df00dkb /74 13.03.2012 17:46 Azoth_primary

Похоже, не фиксирован нифига :(

76. Cthulhu 13.03.2012 18:33 Miranda

Если бы мне нужна была хардкорная оптимизация конкретно в этом месте, я определял бы по старшему установленному биту. Из ассемблера это мгновенно выполняется, в сравнении со взятием логарифма или пачкой делений. Если числа целые, конечно; впрочем, для fp тоже можно что-то подобное запилить.

77. Cthulhu 13.03.2012 18:34 Miranda

Охуеть, откуда в таком треде 70+ комментов?

78. asmerCthulhu /76 13.03.2012 18:34 Psi+

старший установленный бит — это и есть целая часть логарифма, если чо.

79. asmerCthulhu /77 13.03.2012 18:34 Psi+

от дедфуда. он катализатор флуда.

80. generatorglukoffasmer /78 13.03.2012 18:34 Воркота

изначально вопрос стоял о кол-ве цифр в десятичной записи, а не об последующих еротических фантазиях дедфуда

81. asmergeneratorglukoff /80 13.03.2012 18:35 Psi+

ну да. это я вперед забежал

82. Cthulhumagog /1 13.03.2012 18:37 Miranda

python-way.

83. CthulhudiSabler /43 13.03.2012 18:39 Miranda

Как толсто.

84. Cthulhugeneratorglukoff /62 13.03.2012 18:44 Miranda

Когда люди очень сильно выебываются "ололо аптимезация не нужна, у меня нет времени ебаться с ней, лучше я запилю еще парочку уровней абстракции", получается фаерфокс. Который уже нихуя и не читаемый. Впрочем, даже если бы он был охуенно читаемым, встал бы вопрос "чем вы вообще там блядь занимаетесь? Программы пишете, чтобы они работали, или просто код, чтобы он читался?". Я как-то запилю длинную гневную простыню об этом, да, уже пару месяцев собираюсь.

85. 0xd34df00dCthulhu /84 13.03.2012 18:47 Azoth_primary

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

86. 0xd34df00d0xd34df00d /85 13.03.2012 18:48 Azoth_primary

И да, это research project, проверка работоспособности алгоритма и изучение поведения всякого говна. Вопрос порождения айдишников там далеко не на первом и даже не на десятом месте.

87. ulidtkoasmer /22 13.03.2012 19:01 уважением

чуть ли не единственное здравое предложение в треде.

88. Cthulhu0xd34df00d /85 13.03.2012 19:04 Miranda

Верно. Но и писать его "абы как" в надежде, что профилировщик не ткнет туда пальцем, тоже как-то дико. Задумываться над оптимизацией стоит всегда, соблюдая trade-off с читабельностью, конечно; только вот многие людишки возвели эту читабельность в охуевший абсолют и не хотят замечать вокруг больше ничего. От того и растет потребление ресурсов чуть ли не быстрее, чем развитие железа; функционал же при этом фактически стоит на месте. Точнее двигается вперёд, но на несколько порядков медленнее, чем можно было бы предположить, глядя на скорость роста системных требований софта.

89. Cthulhu0xd34df00d /86 13.03.2012 19:05 Miranda

Олсо, я ж не про твой прожект говорю, а про общие тенденции в программировании.

90. magogCthulhu /88 13.03.2012 19:05 Azoth

ты сейчас опять про личкрафты?

91. Cthulhuulidtko /87 13.03.2012 19:06 Miranda

Конечно. Зачем нам думать, оценивать алгоритм с точки зрения количества выполняемых операций? Лучше мы напишем еще один ололо-бенчмарк.

92. 0xd34df00dCthulhu /88 13.03.2012 19:07 Azoth_primary

Просто я ебанусь придумывать и доказывать корректность такого алгоритма расчета цифровых айдишников, чтобы он на дереве хотя бы глубиной в 10 не вылез за 64 бита, и чтобы оно того стоило по сравнению со строками.
Препендить строки друг к другу сейчас быстрее. И я надеюсь, что такой трейдофф позволит мне быстрее реализовать алгоритм в общем и, если потребуется, заниматься уже битоебством и менять деления на сравнения.

93. generatorglukoffCthulhu /91 13.03.2012 19:07 Воркота

а ты можешь гарантировать что цикл на CPU будет быстрее одной операции FPU или наоборот?

94. ulidtkoCthulhu /91 13.03.2012 19:11 уважением

конечно, зачем нам возвращаться к действительности — лучше покукарекаем с дивана.

95. Cthulhumagog /90 13.03.2012 19:12 Miranda

Што. Я сейчас про игры, про венду, про браузеры, да про 95% софта.

96. magogCthulhu /95 13.03.2012 19:12 Azoth

:-(

97. 0xd34df00dulidtko /94 13.03.2012 19:12 Azoth_primary

Вспоминается кутим с действительностью, в которой зависимости между плагинами разруливаются переименованием и повторными попытками загрузить.

98. ulidtko0xd34df00d /97 13.03.2012 19:13 уважением

казалось бы, причём здесь оптимизация как таковая.

99. 0xd34df00dulidtko /98 13.03.2012 19:14 Azoth_primary

Хуй знает, но грех не обосрать кутим :3

100. 0xd34df00dmagog /96 13.03.2012 19:14 Azoth_primary

;3

101. ulidtko0xd34df00d /99 13.03.2012 19:14 уважением

so deadfood.

102. Cthulhugeneratorglukoff /93 13.03.2012 19:16 Miranda

Смотря какой цикл, смотря какая операция. В некоторых пределах я смогу гарантировать это, используя здравый смысл и знания о принципах работы процессора. В спорных случаях я загляну в Интеловские даташиты.
Бенчмарки могут понадобиться в более сложных случаях, когда я заебусь учитывать все нюансы. Но вопрос про логарифм к таким случаям аж никак не относится.

103. Cthulhuulidtko /94 13.03.2012 19:18 Miranda

В твоей действительности у всех людей размер мозга не больше твоего? Тогда, конечно, без костылей никуда.

104. ulidtkoCthulhu /103 13.03.2012 19:18 уважением

нерелевантный слив.
А ты и правда любитель вести дискуссии, как я погляжу.

105. generatorglukoffCthulhu /102 13.03.2012 19:19 Воркота

если мне не изменяет память, логарифмов есть несколько — x87, sse и т.д.

106. 0xd34df00dgeneratorglukoff /105 13.03.2012 19:20 Azoth_primary

> streaming simd extensions
> логарифм
Щито.

107. ulidtkogeneratorglukoff /105 13.03.2012 19:21 уважением

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

108. Cthulhuulidtko /104 13.03.2012 19:24 Miranda

Нерелевантный слив был выше про диван. Мне пришлось лишь релевантно поддержать его, дабы не ввергать тебя в пучину фрустрации.

109. Cthulhugeneratorglukoff /105 13.03.2012 19:30 Miranda

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

110. Cthulhugeneratorglukoff /105 13.03.2012 19:30 Miranda

Так, например => http://gruntthepeon.free.fr/ssemath/

111. asmerCthulhu /91 13.03.2012 19:46 Psi+

в сложных системах заебешся оценивать сложность всевозможных алгоритмов + есть еще ОС, треды, IO, другие задачи в фоне, в которые ты не залезешь.

112. ulidtkoCthulhu /108 13.03.2012 19:53 уважением

нет, это был ответ на агрессию с твоей стороны.

Но хорошо, я разверну мысль. В данной задаче теоретизировать нецелесообразно и даже опасно. Цикл с делениями и fp логарифм зависят от разных функциональных частей процессора (взаимоотношение между которыми сильно варьирует от системы к системе), имеют разное влияние на пайплайн и кеш инструкций. Проанализировать все возможные варианты взаимодействия кода и системы, конечно же, можно, — но при этом появляется слишком большой риск принять в процессе ошибочные или ненадёжные допущения (например, построить свои гарантии на негарантируемых деталях реализации). Непосредственное измерение избавляет от этого риска — а заодно и от трудоёмкого анализа.

113. ulidtkoasmer /111 13.03.2012 19:55 уважением

во-во, примерно об этом же и я.
Не надо пытаться быть слишком умным в сложных системах. Потому что будешь подводить ожидания других.

114. Cthulhuasmer /111 13.03.2012 20:49 Miranda

Про сложные системы я сделал ремарку ниже. А вот как раз бенчмарки и покажут тебе охуенно влияние счедулера и прочих ништяков на твою задачу.

115. Cthulhuulidtko /112 13.03.2012 20:57 Miranda

В данной (достаточно простой) задаче вполне достаточно среднего уровня знаний о принципах взаимодействия разных модулей cpu и представления о том, как работает конвеер/branch prediction unit для того, чтобы оценить оптимальность обоих подходов с достаточной точностью. Никто же не просит нас считать точное число тактов в разных случаях? Мы видим, что один из способов заведомо быстрее; можем обосновать, почему это так; понимаем, какие внешние факторы могут повлиять на соотношение и представляем, что можно изменить, чтобы ослабить/усилить это влияние. В результате имеем куда более глубокое понимание ситуации и потенциал для ее изменения, чем после слепого, бездумного взгляда на цифры из бенчмарка.

116. 0xd34df00d 13.03.2012 20:58 Azoth_primary

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

117. asmer0xd34df00d /116 13.03.2012 20:59 Psi+

можно посмотреть?

118. ulidtkoCthulhu /115 13.03.2012 20:59 уважением

> представления о том, как работает конвеер/branch prediction unit
о даа, это точно средний уровень представлений software developer-ов.

119. 0xd34df00dasmer /117 13.03.2012 21:00 Azoth_primary

Где-то в http://0xd34df00d.me/logs/chat/c_plus_pl...

120. 0xd34df00dulidtko /118 13.03.2012 21:00 Azoth_primary

Средний софтваре девелопер пишет CMS на джангопитонах и даже не знает, что такое логарифм.

121. ulidtkoCthulhu /115 13.03.2012 21:02 уважением

я не отрицаю, что интерпретировать результаты бенчмарка нужно. Неожиданные результаты должны удивлять, а не убеждать. Скажем, я удивился, когда плюсовый std::set работал медленнее питоновского set — и этому нашлось объяснение.
Но пустое, «диванное» теоретизирование здесь без фактического материала неуместно. Это моя точка зрения.

122. ulidtko0xd34df00d /120 13.03.2012 21:03 уважением

и получает нехуёвые деньги при этом!

123. 0xd34df00dulidtko /122 13.03.2012 21:03 Azoth_primary

Я лучше буду получать свои 60к за ненапряжную и приятную удаленочку с плюсами и NLP, а также получать удовольствие и кавай от научечек на хаскеле.

124. ulidtko0xd34df00d /123 13.03.2012 21:05 уважением

тащемта, к тебе претензий никаких и нет. Занимайся, чем нравится, няша. Но не стоит судить других по тому, что предпочитают они.

125. 0xd34df00dulidtko /124 13.03.2012 21:06 Azoth_primary

Я осуждаю людей, которые осилили бедон и жангу и теперь гордо именуются ПРОГРАММИСТАМИ.
// сам жангу ниасилил

126. ulidtko0xd34df00d /125 13.03.2012 21:08 уважением

ну если это задевает твоё чувство элитизма, именуйся не программистом. Гордое СОФТВАРЕ ДЕВЕЛОПЕР или СОФТВАРЕ ИНЖИНИАР — гораздо элитнее, чем the dreaded «программист».

127. 0xd34df00dulidtko /126 13.03.2012 21:09 Azoth_primary

Кокой ты, элитизм, кококо.

128. ulidtko0xd34df00d /127 13.03.2012 21:09 уважением

ну а что это, не элитизм? Именно он.

129. asmer0xd34df00d /119 13.03.2012 21:10 Psi+

посмотрел, затестил:
700000
750000
увеличил на ноль бенч-цикл (т. е. в 10 раз):
7.11e+06
7.5e+06.
логарифм — второе. amd64, core 2 duo 2gHz, gentoo. Такое. Странно что результат близок по времени. Очень странно.
На числе 1234567891:
7.85e+06
7.51e+06
логарифм немного выигрывает. больше — переполнение int, не хочу менять тип.

130. 0xd34df00dasmer /129 13.03.2012 21:10 Azoth_primary

Поменяй, uint64_t же. Интересно.

131. asmer0xd34df00d /130 13.03.2012 21:13 Psi+

послало uint, поставил long:
1.61e+07
7.58e+06 логарифм хуярит в 2 с лишним раза лучше чем деление. это на 123456789123456789

132. Cthulhu0xd34df00d /116 13.03.2012 21:14 Miranda

Да. При этом он не посмотрел на то, во что компилятор превратил цикл и что происходит с бренч предиктором при его работе.

133. asmerCthulhu /132 13.03.2012 21:15 Psi+

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

134. ulidtkoasmer /133 13.03.2012 21:15 уважением

хуле там дизассемблировать-то, делов

135. Cthulhuulidtko /118 13.03.2012 21:15 Miranda

Я считаю, что хороший программист должен иметь хорошее представление о таких вещах. Средний, соответственно, хотя бы среднее. Впрочем, хорошие программисты сейчас не в моде, согласен.

136. 0xd34df00dasmer /131 13.03.2012 21:16 Azoth_primary

Гм, любопытно. Я не ожидал, что деление соснет так быстро, да.

137. ulidtkoCthulhu /132 13.03.2012 21:16 уважением

кстати, я бы всё-таки сделал округление явно. А то int(x + 1.0) совсем не то же самое, что int(x) + 1.

138. asmerulidtko /134 13.03.2012 21:16 Psi+

да нехуй, но это не даст ответа, что сделает х-ль. Для несмотряторов:
#include <iostream>
#include <ctime>
#include <cmath>
using namespace std;

int nDigDiv(long chi){
int n=1;
while(chi/=10)
++n;
return n;
}

int nDigLog(long chi){
return log10(chi)+1;
}

int main(){
double t=clock();
for(int i=0;i<100000000;++i)
nDigDiv(123456789123456789);
clog<<clock()-t<<'\n';
t=clock();
for(int i=0;i<100000000;++i)
nDigLog(123456789123456789);
clog<<clock()-t;

}

139. 0xd34df00dulidtko /134 13.03.2012 21:16 Azoth_primary

gcc -S отменили?

140. 0xd34df00dasmer /133 13.03.2012 21:17 Azoth_primary

Вот на хаскеле я бы точно засцал дизассемблировать. Монады ленивость хуе-мое.

141. Cthulhuulidtko /118 13.03.2012 21:17 Miranda

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

142. ulidtko0xd34df00d /139 13.03.2012 21:17 уважением

ну так. Хотя я бы поюзал gcc -g -O2, objdump -S

143. asmerulidtko /142 13.03.2012 21:18 Psi+

и это даст ответ, что сделает в этих случаях ghc?

144. ulidtkoasmer /143 13.03.2012 21:18 уважением

нет. А причём здесь ghc?

145. 0xd34df00dCthulhu /132 13.03.2012 21:18 Azoth_primary

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

146. 0xd34df00dasmer /143 13.03.2012 21:18 Azoth_primary

Я даже в сишный высер ghc не хочу лезть, а ты про асм :(

147. Cthulhuulidtko /121 13.03.2012 21:19 Miranda

Разница в подходах. Ты считаешь, что бенчмарк первичен, и что там внутри — знать особо и не нужно; потому все, где не было бенчмарка — "диванное теоретизирование". Я же считаю наоборот — первичным должно быть понимание, а бенчмарки — лишь вспомогательные тулзы для упрощения&убеждения; и в простейших случаях без них можно обойтись. Обе точки зрения имеют право на существование, наверное; вот только у меня баттхёрт от такого положения вещей.

148. asmer0xd34df00d /146 13.03.2012 21:19 Psi+

бля, вы меня за хаскель посадите этим бенчмарком :D.

149. asmerCthulhu /147 13.03.2012 21:20 Psi+

столкнулись практик и теоретик.

150. ulidtkoasmer /149 13.03.2012 21:20 уважением

++

151. asmerulidtko /150 13.03.2012 21:21 Psi+

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

152. Cthulhuulidtko /128 13.03.2012 21:24 Miranda

Нет, это не элитизм. Вот объективно, есть более простые вещи, и есть более сложные (либо сложные для осознания, либо просто задротские, требующие временных инвестиций для погружения). Закономерно, что за использование более сложных вещей в общем случае человек получает больше денег (в общем случае, матаноебствующего в изоляции Дедфуда не рассматриваем). Закономерно, что прошарив эти "более сложные" вещи, он будет подсознательно ожидать такого же уровня понимания и от всех остальных коллег, и ловить разрыв шаблона, когда его ожидания обманываются.

153. Cthulhuasmer /131 13.03.2012 21:26 Miranda

У тебя гента ia32 или x86_64?

154. asmerCthulhu /152 13.03.2012 21:27 Psi+

люто плюсую. Развелось быдлокодеров, не понимающих элементарных вещей. Заебись что я в 90е ебал ассемблер. Добавило понимания. И ембеддед способствует. А уже выросло поколение людей, которые не представляют, что ПАМЯТЬ И БЛОКИ В НЕЙ НЕ РЕЗИНОВЫЕ, а посему пользовать её надо правильно, и не будет тупить/cвопить. Они вообще не думают об этом, им похуй.

155. asmerCthulhu /153 13.03.2012 21:27 Psi+

amd64

156. Cthulhuasmer /138 13.03.2012 21:28 Miranda

Ключи компиляции забыл )

157. 0xd34df00dasmer /148 13.03.2012 21:28 Azoth_primary

Запускаешь ghci, набираешь log число, получаешь его двоичный логарифм (кстати, можно оценить разницу log_2 и log_10).
Запускаешь ghci, набираешь :m + Data.List, а потом что-то такое:
Prelude Data.List> findIndex (230543 <) $ map (10**) [0,1..]
Just 6

Это вариант а-ля lower_bound, без деления. С делением аналогично.

158. Cthulhu0xd34df00d /140 13.03.2012 21:29 Miranda

Кстати, надо как-то глянуть. Ато я так ни разу и не сталкивался с его бинарниками в диком виде.

159. ulidtkoCthulhu /152 13.03.2012 21:29 уважением

> Закономерно, что за использование более сложных вещей в общем случае человек получает больше денег
не согласен. Получаемые деньги зависят от спроса — от того, насколько нужные вещи делает человек. Как он это делает — это уже вторичный вопрос, который от публики может даже намеренно скрываться, aka know-how.

Аналогично и в команде. Здесь, правда, это «как» скрыть не получится — потому что другим нужно с тобой кооперироваться.

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

160. asmerCthulhu /156 13.03.2012 21:30 Psi+

$ make signs
g++ signs.cpp -o signs
без нихуя.

161. 0xd34df00dCthulhu /158 13.03.2012 21:31 Azoth_primary

enjoy, например. Возможно, он даже с информацией для профилирования, не помню.
Это бинарь с проектом для ГА. МАТРИЦЫ ДЕРЕВЬЯ ХУЕ_МОЕ

162. ulidtkoasmer /154 13.03.2012 21:31 уважением

Спольски тоже ныл на эту тему http://www.joelonsoftware.com/articles/f...

163. 0xd34df00dCthulhu /152 13.03.2012 21:31 Azoth_primary

А што сразу я :(

164. 0xd34df00dulidtko /159 13.03.2012 21:32 Azoth_primary

Корреляция между спросом и сложностью вещей тебе разве не очевидна?

165. ulidtko0xd34df00d /164 13.03.2012 21:33 уважением

нет. Разве что отрицательная.

166. Cthulhuulidtko /159 13.03.2012 21:36 Miranda

1) Под "более сложными вещами" я понимал не "какую-то никому не нужную херь, для которой уже давно появились простые заменители", а именно те более сложные вещи, для которых заменителей нет и никогда в обозримом будущем не появится.
2) В умной команде быть умным совсем не контрпродуктивно. Контрпродуктивно выебываться выше среднего уровня команды; если возникает такое желание — лучше найти команду "уровнем" повыше, вот и все.

167. Cthulhuasmer /160 13.03.2012 21:36 Miranda

А теперь сделай -O2, а потом -O3 же, ну :(

168. asmerCthulhu /167 13.03.2012 21:37 Psi+

бля, у вас что. конпеляторов под боком нет. сделайте, хуле

169. Cthulhuulidtko /162 13.03.2012 21:37 Miranda

Это и без Спольски заметно по среднему уровню качества массового софта сегодня.

170. ulidtkoCthulhu /166 13.03.2012 21:37 уважением

2) абсолютно верно.

171. Cthulhu0xd34df00d /163 13.03.2012 21:37 Miranda

Потому что 60к для москвы — зарплата продвинутого джуниора, например.

172. 0xd34df00dCthulhu /171 13.03.2012 21:38 Azoth_primary

Это если фуллтайм. А я сижу, делаю что-то когда-то, параллельно с уебой и другими проектами, и ваще ништяк.

173. Cthulhuasmer /168 13.03.2012 21:38 Miranda

У меня здесь нет, например.

174. asmerCthulhu /173 13.03.2012 21:39 Psi+

@0xd34df00d, а у тебя есть gcc?

175. 0xd34df00dasmer /174 13.03.2012 21:40 Azoth_primary

Да, есть, но он щас объебался темплейтами и устал :(

176. ulidtkoCthulhu /169 13.03.2012 21:52 уважением

и это проблема. Которую непонятно как решать иначе, чем через наслаивания абстракций вроде JVM, и делегирования всех сложностей и тонкостей «под» них. Точно так же как сишечка в своё время предоставила универсально прижившуюся абстракцию для ассемблеров.
При этом абстракция может давать предостаточно пространства для решения проблем с производительностью. Я имею ввиду JIT и подобные технологии того самого «умного компилирования», когда программист-клиент абстракции только высказывает свой замысел, intent — а среда поддержки абстракции (e.g. jre) самостоятельно приходит к оптимальным «деталям». Естественно, это требует ресерческих усилий, это много дизайна, кодинга и отладки, этц — но по крайней мере такой путь предоставляет решение проблемы. В то время как бесконечное вождение новичков по граблям и набивание шишек по каждой неабстрагированной детали а-ля C++ не слишком-то преуспевает как альтернативный способ решения.

177. asmerCthulhu /167 13.03.2012 21:52 Psi+

ЛОЛ:
asmer@iridium ~/progging/c++ $ g++ -O2 signs.cpp -o signs
asmer@iridium ~/progging/c++ $ ./signs
0
8.25e+06
asmer@iridium ~/progging/c++ $ g++ -O3 signs.cpp -o signs
asmer@iridium ~/progging/c++ $ ./signs
0
0

178. ulidtkoasmer /177 13.03.2012 21:53 уважением

бля, этому бенчмарку нужен более адекватный способ засекания времени.

179. asmerulidtko /178 13.03.2012 21:55 Psi+

не. время тут не причем. это реальное время, задержка заметна на предыдущих тестах без оптимизации. C O2 заметна задержка второго цикла. g++ соптимизировал цикл(ы) в одну итерацию, я думаю.

180. ulidtkoasmer /179 13.03.2012 21:56 уважением

посмотри уже objdump -S

181. asmerulidtko /180 13.03.2012 21:57 Psi+

как попросить gcc дать объектник? а то кроме бинаря ниче нету, objdump не на что натравливать.

182. ulidtkoasmer /181 13.03.2012 21:57 уважением

-c

183. Cthulhuulidtko /176 13.03.2012 22:05 Miranda

Да. Скорее всего it в будущем будет развиваться именно в этом направлении. Хотя у меня все же теплится смутная надежда, что человечество возьмется за голову, выкинет нахуй императивное легаси и уйдет в математически строгую функциональщину. Но такого никогда не случится, увы :(

А чтобы слоить абстракции так, как ты описал, нужно дождаться скачкообразного роста ресурсов железа. Но, блин, насколько же грустно будет осознавать, как впустую проебывается 90% его потенциала.

Пойду пуэра выпью лучше для восстановления морального комфорта, да потис^W

184. 0xd34df00dCthulhu /183 13.03.2012 22:26 Azoth_primary

Предлагаю устроить термоядерную войну с гарантированным полным уничтожением всего, и проблема императивщины не встанет еще долго.

А вообще, люди, блядь, указатели понять не могут, а ты их хочешь в рекурсию, фолдры, чистоту и монады. Ну не издевайся ты так.

Тян себе потискай, Ктулху! А я пойду потискаю еще эти графы да выпью реврайтов.

185. asmerulidtko /182 13.03.2012 22:29 Psi+

http://pastebin.com/aAuFUShw -O3

186. ulidtkoasmer /185 13.03.2012 22:29 уважением

-g добавь же

187. 0xd34df00dasmer /185 13.03.2012 22:29 Azoth_primary

Сучечка, мне от тебя захотелось под avr'ки поасмоебствовать.

188. ulidtkoulidtko /186 13.03.2012 22:30 уважением

а, не, вижу.

189. asmer0xd34df00d /187 13.03.2012 22:30 Psi+

я когда под пики писал. охуеть, 35 команд и умри. еще и стек, сука, отдельно.

190. 0xd34df00dasmer /189 13.03.2012 22:31 Azoth_primary

А я, на самом деле, даже под аттини на плюсцах с темплейтами писал, а __asm был в отдельных заповедниках, вокруг которых были типобезопасные обертки, няшнота.

191. asmerulidtko /188 13.03.2012 22:31 Psi+

btw, я нихуя не понимаю в этом коде. Ну т. е. не совсем нихуя, но после i86 realmode тут непонятны некоторые команды. однако условных переходов на для for я не вижу.

192. asmer0xd34df00d /190 13.03.2012 22:32 Psi+

я помню. я педалю на pure c.

193. ulidtko 14.03.2012 00:20

Вот графички с моего ноута:



Код здесь http://hpaste.org/65262

Явно видно, что цикл с делением заруливает — в противовес результатам на машине @asmer.
Что, собственно, и подтверждает мою тезу о бесполезности теоретического анализа здесь: YMMV, всё зависит от конкретной железки.

194. 0xd34df00dulidtko /193 14.03.2012 00:22 Azoth_primary

Кокой моднявый, с std::chrono. Завтра обязательно набросаю тестик.

195. ulidtko0xd34df00d /194 14.03.2012 00:23 уважением

а то!
Аж стандарт открыл, чтоб хотя бы прототипы видеть. А то в интернетах совсем что-то мануалов дефицит.

196. 0xd34df00dulidtko /193 14.03.2012 00:26 Azoth

Попробуй, кстати, написать в районе 12-ой строки volatile. А то тупой вызов функции без сайд-эффектов кучу разз подряд меня смущает.

197. ulidtko0xd34df00d /196 14.03.2012 00:30 уважением

> void();
> C++
> сайд-эффекты

и нафига volatile в 12-й строчке? я лучше дизасм почитаю, интереснее будет.

198. 0xd34df00dulidtko /197 14.03.2012 00:31 Azoth

Компилятор, по-твоему, настолько туп, чтобы не увидеть, что твои эти деления на 10 не меняют глобального состояния? Почитай уже про современные оптимизации, ну. И про значение volatile заодно.

199. ulidtko0xd34df00d /198 14.03.2012 00:32 уважением

про volatile я знаю. А про современные оптимизации — сейчас увидим.

200. 0xd34df00dulidtko /199 14.03.2012 00:32 Azoth

В плюсокодотреде 200 комментов, пстач торт.

201. ulidtko0xd34df00d /200 14.03.2012 01:47 уважением

в общем, цикл там есть, функции не заинлайнены, и даже вызов их делается через регистр+смещение — типично для method call. Адреса функций используются где-то поблизости от инициализации std::function и std::bind. Алсо, std::function при инициализации вызывает operator new(unsigned int), лол.

Ещё заинлайнено дохуя темплейтов, листинг периодически РАСПИДАРАШИВАЕТ. Но энивей, твои подозрения насчёт слишком умного gcc напрасны :3

202. Cthulhuulidtko /193 14.03.2012 06:12 Miranda

(
Вот сейчас ты запилил типичнейший абстрактный бенчмарк в вакууме, бессмысленный и беспощадный. Не вдаваясь даже в дебри того, что там сгенерирует gcc в результате использования тонн задействованных посторонних сущностей, просто посмотри на то, как работает твоя реализация ceil(). Ты будешь удивлен, скорее всего. А потом представь, что происходит с пайплайнами в результате ее работы.

Да, в некоторой степени быстродействие зависит "от конкретной железки". Но не как-то магически "ой нам не понять, просто примем как данность", а зависит от конкретных факторов. И на последних камнях этот разброс не настолько огромен, чтобы быть заметным на таких минималистичных примерах.

Потому этот бенчмарк лишь еще раз подтверждает тезис о том, что вот так сурово писать бенчмарки и смотреть на результат, как на откровение свыше — ошибка.

203. Cthulhuasmer /185 14.03.2012 06:17 Miranda

У меня от at&t синтаксиса брат умер :(

204. ulidtkoCthulhu /202 14.03.2012 13:33

в дебри я вдавался. ceil (хотя там вообще-то должен быть floor, гм-гм; но особой разницы в генерируемый код это не вносит) разворачивается макросами в пачку fp инструкций. Что меня не удивляет. Смотри сам:
804860d: dd 44 24 20 fldl 0x20(%esp)
8048611: dd 1c 24 fstpl (%esp)
8048614: e8 b7 ff ff ff call 80485d0 <log10@plt>

8048619: d9 7c 24 2c fnstcw 0x2c(%esp)
804861d: 0f b7 44 24 2c movzwl 0x2c(%esp),%eax
8048622: 25 ff f3 00 00 and $0xf3ff,%eax
8048627: 0d 00 08 00 00 or $0x800,%eax
804862c: 66 89 44 24 2e mov %ax,0x2e(%esp)
8048631: d9 6c 24 2e fldcw 0x2e(%esp)
8048635: d9 fc frndint
8048637: d9 6c 24 2c fldcw 0x2c(%esp)
804863b: dd 5c 24 18 fstpl 0x18(%esp)
804863f: dd 44 24 18 fldl 0x18(%esp)
8048643: d8 05 40 88 04 08 fadds 0x8048840

это ceil. floor:

8048619: d9 7c 24 2c fnstcw 0x2c(%esp)
804861d: 0f b7 44 24 2c movzwl 0x2c(%esp),%eax
8048622: 25 ff f3 00 00 and $0xf3ff,%eax
8048627: 0d 00 04 00 00 or $0x400,%eax
804862c: 66 89 44 24 2e mov %ax,0x2e(%esp)
8048631: d9 6c 24 2e fldcw 0x2e(%esp)
8048635: d9 fc frndint
8048637: d9 6c 24 2c fldcw 0x2c(%esp)
804863b: dd 5c 24 18 fstpl 0x18(%esp)
804863f: dd 44 24 18 fldl 0x18(%esp)
8048643: d8 05 40 88 04 08 fadds 0x8048840

я вижу какие-то манипуляции с битовым представлением, затем frndint, затем fadds константы 1.0. Что здесь не так? Всё ожидаемо.

Да, конкретные повлиявшие факторы проанализировать можно, но мне лень. Я вижу, что на одной машине в два раза заруливает один метод, на другой — другой. Я также могу проинтерпретировать эти результаты, и заодно объяснить каждую фичу на графиках выше — но, опять же, лень.

205. Cthulhuulidtko /204 14.03.2012 14:01 work

Ты меня случайно не троллишь сейчас? )
Это не "какие-то манипуляции с битовым представлением". Это получение fpu control word, изменение некоторых флагов в нем (отвечающих за направление округления), и восстановление его оригинального значения после выполнения frndint.

И вот эта хрень у тебя выполняется на каждой итерации цикла. Изменение режима работы fpu, вызов еще одной его команды (не такой уж и дешевой), и изменение режима обратно.

В бенчмарке, который мы рассматривали выше, этого не было (потому что не ceil, нни floor там не вызывали).

И теперь, внимание, вопрос к знатокам. Когда ты сравниваешь результаты двух бенчмарков без учета вышеописанного фактора, и списываешь охуенную разницу на влияние железа... Как это называется?

206. ulidtkoCthulhu /205 14.03.2012 18:04 уважением

нет, не троллю. Замечание принимается, переделаю без floor.

207. nexeuseasmer /177 14.03.2012 19:55

gcc выкинул оба цикла.
volatile int _ = nDigDiv(123456789123456789);

Do you really want to delete ?