- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
static inline uint64_t parse_hex_uint64(const char *s) {
const uint64_t m1 = 0x4040404040404040ll;
const uint64_t m2 = 0x000F000F000F000Fll;
const uint64_t m3 = 0x0F000F000F000F00ll;
const uint64_t *p = (const uint64_t*)s;
int64_t a = p[0], b = p[1];
a += ((a & m1) >> 6) * 9;
b += ((b & m1) >> 6) * 9;
a = (a & m2) << 12 | (a & m3);
b = (b & m2) << 12 | (b & m3);
a |= a >> 24;
b = b >> 8 | b << 16;
return (a & 0x0000FFFF00000000ll) | (a & 0xFFFF) << 48 | b >> 48 | (b & 0xFFFF0000);
}
bormand 29.03.2013 06:51 # 0
tirinox 29.03.2013 22:10 # +2
defecate-plusplus 29.03.2013 08:45 # 0
ждём base64
bormand 29.03.2013 09:17 # 0
base64 на стадии проектирования на бумажке, свободного времени на него пока нет.
bormand 08.01.2019 22:17 # +2
bormand 08.01.2019 22:24 # 0
bormand 08.01.2019 22:51 # 0
bormand 08.01.2019 23:02 # 0
stepanPlus7 08.01.2019 23:10 # −4
bormand 08.01.2019 23:24 # 0
gost 08.01.2019 23:17 # 0
Всё, хватит, оно уже полное!
stepanPlus7 08.01.2019 23:53 # −2
Испытал ли ты при этом оргазм?
bormand 09.01.2019 00:07 # −1
Карандаш же острый. Насколько надо упороться, чтобы куда-то его совать?
stepanPlus7 09.01.2019 00:19 # −3
Вторым предметом, побывавшим в моей жопе, была отвёртка с круглой ручкой (14 лет).
bormand 09.01.2019 00:28 # −2
stepanPlus7 09.01.2019 00:31 # −3
http://clubsamodelok.ru/wp-content/uploads/2018/03/SHilo-svoimi-rukami-45.jpg
bormand 09.01.2019 07:15 # 0
fuckyou 09.01.2019 13:51 # −101
rOMOCEKCYAjluCT 09.01.2019 00:35 # −104
Борманд плохого не посоветует.
stepanPlus7 09.01.2019 00:39 # −2
solnze_dar 09.01.2019 07:59 # 0
В данном случае интереснее не насколько, а чем. От «Солнцедара» на засовывание карандашей в прямую кишку не тянет.
defecate-plusplus 09.01.2019 09:59 # +3
и вот наконец-то я понял о чем мне постоянно твердили более опытные товарищи
только ведь не 100 строк в неделю, а 30 в 5 лет!
HoBorogHuu_nemyx 09.01.2019 10:06 # +2
real_escape_string 13.05.2019 08:08 # 0
guest 29.03.2013 10:38 # 0
bormand 29.03.2013 11:13 # +3
wvxvw 29.03.2013 11:50 # 0
Вот написать бы к этой функцие прямое (вместо итеративного) вычисление? ;) . Нужно представлять числа в троичной системе, делать хитрые замены битов.
bormand 29.03.2013 12:14 # 0
defecate-plusplus 29.03.2013 12:15 # +2
base64 туда-сюда гоняется по сети гораздо чаще, причем его объемы вполне позволяют пачкой обрабатывать блоки
wvxvw 29.03.2013 12:30 # 0
defecate-plusplus 29.03.2013 12:55 # +2
bormand 29.03.2013 13:37 # +1
> оптимальнее
*facepalm*. Здесь 39 ассемблерных инструкций (если я не обсчитался), т.е. в районе 2.5 инструкций на разряд, и ни одного перехода.
Обогнать по идее можно только раскрученным циклом и табличкой которая преобразовывает 2 цифры в один байт (65кб). Но это нанесет удар по L1.
> почти наверняка
Предлагайте алгоритм, буду рад провести бенчмарк ;)
P.S. У этой функции, конечно же есть и недостаток - на кривых данных ее поведение не определено.
defecate-plusplus 29.03.2013 14:45 # +1
что-то не сходится в твоей функции, не знаю почему
но показатели времени хорошие
bormand 29.03.2013 14:52 # +2
http://liveworkspace.org/code/33rWZ9$3
HoBorogHuu_nemyx 09.01.2019 08:34 # +1
Кстати, какие подобные сервисы сейчас существуют? У меня в кокококоллекции такие:
https://ideone.com/
https://godbolt.org/
https://wandbox.org/
https://rextester.com/
http://codepad.org/
http://coliru.stacked-crooked.com/
HoBorogHuu_nemyx 09.01.2019 09:39 # +1
https://www.codechef.com/ide
https://tio.run/
https://code.hackerearth.com/
gpyrou_nemyx 09.01.2019 11:45 # +1
На tio.run, кстати, самое большое число языков, ограничение по времени там, если не ошибаюсь чуть ли не минута, и вообще он самый удобный.
З.Ы. вопрос об онлайн-конпеляторах: достаточно ли им запускать код в виртуоленной мышыне которой нет доступа к сети и там ещё не знаю что, чтобы было бизапасна?
gost 09.01.2019 11:54 # +2
Очень много языков, включая «Аду», «Brainfuck» и «Forth».
gpyrou_nemyx 09.01.2019 12:03 # +2
gost 09.01.2019 12:04 # 0
gost 09.01.2019 09:52 # +2
Быстрый бенчмарк для кода на крестах/цэ, очень удобная штука для холиваров.
gpyrou_nemyx 09.01.2019 11:46 # 0
gost 09.01.2019 11:52 # 0
gpyrou_nemyx 09.01.2019 12:00 # +1
Именно поэтому я за "Forth".
Походу кто-то опять досит говнокодик :(
lha 25.10.2019 04:16 # 0
https://cppinsights.io/about.html
Не компилятор и не песочница, а что-то типа современного аналога Cfront: компилирует лямбды, for по итераторам, auto, decltype, рекурсивные шаблоны, инициализаторы в фигурных скобках в конструкции, понятные C++03/C++98.
Спасибо Elvenfighter.
wvxvw 29.03.2013 14:53 # 0
Хз, бенчмарков не делал, ну и как бы ничего в этом нетривиальног вроде нет... Ну да делать бенчмарки функций которые в принципе никогда не будут выполнять ничего такого, что может повлиять на производительность? :) Как бы даже не знаю... я чет совсем не в настроении спорить, ну точно не про производительность такой функции.
defecate-plusplus 29.03.2013 15:05 # +5
да разве ж нам жалко сделать бенчмарк?
вот так вот одно вычитание ухудшает почти в 2 раза результат, притом, что с маленькими буквами не работает вовсе
LispGovno 29.03.2013 15:13 # +2
3.14159265 29.03.2013 16:42 # +5
И потом распинался почему оно должно быть быстрее.
>вот так вот одно вычитание ухудшает почти в 2 раза
> маленькими буквами не работает вовсе
В старом треде вы же сами постили:
chr & ~(_T('a') - _T('A'))
defecate-plusplus 29.03.2013 16:45 # +2
3.14159265 29.03.2013 16:46 # +1
bat 26.10.2019 07:24 # 0
Забавно, но раньше на «Говнокоде» было популярным обращение на «вы», а сейчас чаще обращаются на «ты».
3.14159265 30.03.2013 23:07 # +1
Вот у меня руки дошли сделать бенч. И оказалось, как я и думал впрочем, бутылочое горлышко в перестановке. И всё работает еще быстрее.
http://liveworkspace.org/code/1lmQMa$15
Да и в целом всё оказалось еще удивительное. Не пойму почему мой вариант с проверками (который содержит раза в 3-4 больше кода) работает так же быстро как и борманда:? 26ms
Логично предположить что еще где-то есть тормознутый кусок. То есть преимущество над жалкими потугами с условиями и таблицами, как я и предполагал, в десятки раз.
Хе-хе-хе.
LispGovno 30.03.2013 23:12 # −2
3.14159265 01.04.2013 14:33 # 0
LispGovno 01.04.2013 15:01 # 0
3.14159265 01.04.2013 15:07 # +3
Спорное утверждение. У интела уже лет 7 лучше переходы предсказываются. Вообще интел лучше работает. А у амд ядер больше за те же деньги.
Тем более что Борманд и я реализовывали одну идею. Только я добавил проверку корректности, на "чистой" же "арифметике".
Исключение один if, который проверяет валидность входных данных и кидает исключение, например (чего не было у Борманда). Без него тут никак.
3.14159265 01.04.2013 20:42 # 0
За исключением очевидного
>(a & 0xFFFF) << 48
>a<<48
3.14159265 02.04.2013 16:05 # +1
Мои попытки написать reverse+compress с нуля заняли тоже ровно 20 инструкций и обе медленее.
Я чуть-чуть причесал код борманда, так что оба упакованных способа (с проверкой и без) делают самый быстрый из примеров на 1мс :)
http://liveworkspace.org/code/1lmQMa$56
crap_PI: 96 ms, control 3811068283262806208
bormand: 92 ms, control 3811068283262806208
dual un: 97 ms, control 3811068283262806208
PS Православные шаффлы SSE серъезно усилили бы разрыв.
bormand 29.03.2013 15:15 # +1
http://liveworkspace.org/code/33rWZ9$18
defecate-plusplus 29.03.2013 15:16 # +1
таблица 256 получилась в 2 раза медленнее таблицы 256*256
bormand 29.03.2013 15:20 # +2
defecate-plusplus 29.03.2013 15:24 # +1
bormand 29.03.2013 15:30 # +1
wvxvw 29.03.2013 19:43 # +1
Кстати, первый раз в жизни пишу что-то на сиплюсплюс. %)
3.14159265 29.03.2013 20:21 # +6
Многие экзотические языки пробовал именно тут.
vistefan 30.03.2013 23:10 # +4
3.14159265 29.03.2013 16:37 # 0
А HEX тоже много гоняется по сети. Уникод в xmlе ( ) и в jsone
Вот StringEscapeUtils в apache commons он практически все символы, без разбору, превращал при экранировании в такой hex.
Так что практическое применение, безусловно есть.
3.14159265 29.03.2013 18:04 # 0
>бы к этой функцие прямое (вместо итеративного) вычисление? ;)
Надо много думать. Но нет ничего невозможного.
А какая практическая ценность такого?
wvxvw 29.03.2013 23:05 # 0
3.14159265 29.03.2013 23:09 # +1
От HEXа - явно польза есть. А методы куда более общие: можно быстро искать в тексте, сравнивать текст по маске.
И кривая Гильберта на практике используется.
wvxvw 29.03.2013 23:15 # 0
TarasB 30.03.2013 13:11 # +4
звучит...
Всего лишь перепутал "э" с "е" и какой результат!
wvxvw 30.03.2013 13:40 # 0
В последнее время много заимствований делается по принципу "кто первый перевел - так и будет". Особенно в этом смысле показательны заимствования из Китайского, где русская фонетическая транскрипция, как правило, абсолютно не похожа ни на один из использующихся диалектов, плюс к тому еще и непхожа каждый раз по-разному. Обычный китаец никогда в жизни бы не догадался, кто такой Чан Кайши или Мао Дзедун.
eth0 30.03.2013 18:56 # 0
Хотя, конечно, викижопия не является достоверным источником информации.
> из Китайского
Оный Китай почти во всём мире называется "Сина" (в старорусском тоже), там сама история с азиатскими языками лютая.
wvxvw 30.03.2013 19:20 # 0
eth0 31.03.2013 11:43 # +1
scriptin 31.03.2013 16:43 # 0
LispGovno 31.03.2013 21:40 # −1
Не, я вру. Его подругому звали.
ivanzoid 29.03.2013 13:55 # 0
3.14159265 29.03.2013 16:04 # 0
> a += ((a & m1) >> 6) * 9;
> b += ((b & m1) >> 6) * 9;
Не асспараллельно как-то. Или оно в одну коммаду компилируется?
bormand 29.03.2013 16:05 # 0
3.14159265 29.03.2013 16:55 # 0
>mmx
Не сможет. Он 64.
Зато AVX2 сможет и по 4 за раз.
bormand 29.03.2013 17:07 # 0
Брал 2 блока чтобы заполнить 64 битное число. Если читать его как 2 32битных а потом сдвигать и клеить - получим немного лишних операций, а тут 3-4 такта выигрываю засчет этого "инлайна".
3.14159265 29.03.2013 17:14 # 0
У вас 2 64-битных.
>int64_t a = p[0], b = p[1];
Почему не обрабатывать одним махом, раз это для x64
defecate-plusplus 29.03.2013 17:21 # 0
одним махом - это 128 разрядное целое должно быть
3.14159265 29.03.2013 17:24 # 0
GCC оптимизирует при наличии SSE? Или это своеобразный анроллинг?
bormand 29.03.2013 17:26 # 0
3.14159265 29.03.2013 17:41 # 0
3.14159265 29.03.2013 16:08 # +1
Это фиксится теми же способами. Вчера я чего-то тупил, никак не мог найти маски.
А сегодня мне очевидно как искать.
Вот, примерная версия с заделом на оптимизацию:
3.14159265 29.03.2013 17:54 # 0
lm и im могут быть полезны сами по себе.
Тут:
http://ideone.com/hCqsxb
bormand 29.03.2013 18:12 # 0
3.14159265 29.03.2013 18:16 # 0
Просто это самый сложный кусок, на мой взгляд. Как проверка на диапазоны [30-50),[60,70) - багов не имеет.
Остальное - довольно тривиально. Будет отдельным патчем.
Да и мой подход универсальный. если не хватает денег на процессор с SSE 4.2 c pcmpestri, а сильно хочется быстрого поиска по диапазонам, или конкретных значений.
Все буквы, цифры. По сути это простейшие регэксы, но ускоренные на аппаратном уровне. Область применения шире hex-ов.
crastinus 22.02.2014 17:53 # 0
Использовал на дня эту фичу. Поиск подстроки получался где-то на 30% быстрее (чем strstr). Поиск строки из 4-х элементов уже 2-3 раза в зависимости от компилятора.
А хочется перфоманса. В конце концов парсеры спирита на него переписать;)
3.14159265 29.03.2013 18:22 # 0
Прям просятся. Просто lm может быть ценен сам по себе, потому я оставил промежуточные значения.
bormand 29.03.2013 18:30 # +7
vistefan 31.03.2013 20:58 # +2
LispGovno 31.03.2013 21:39 # +2
vistefan 31.03.2013 22:00 # +2
anonimb84a2f6fd141 21.07.2013 19:52 # 0
TarasB 31.03.2013 22:58 # +4
3.14159265 01.04.2013 14:30 # +4
Позже удивляясь чего же они там плюсуют?
bormand 01.04.2013 16:27 # +4
Мудр не тот, кто не постит хуйню, а тот, кто ее вовремя стирает.
3.14159265 01.04.2013 16:51 # +3
guest8 09.01.2019 22:15 # −999
3.14159265 29.03.2013 22:43 # 0
Но нули тоже просто сделать, используя мою маску fm и выполнив еще 2 комманды.
Итак продолжаем наш праздник.
Когда мы знаем что числа в диапазоне 30-50, то тут уже всё просто.
К тем цифрам что в диапазоне 30-40 надо прибавить 6.
А к буквам в диапазоне 40-50 надо прибавить 10.
То есть 3 -> 6, а 4(6) ->10
Это s=((a>>2)+a)<<1.
Маскируем верхний полубайт | 7 и потом прибавляем s к младшему ниблу .
В итоге получаем корректность верхнем бите , как и в прошлом случае.
Остается одно говно. 40/60h
3.14159265 30.03.2013 18:43 # 0
http://ideone.com/tm6MZT
3.14159265 30.03.2013 20:58 # 0
http://ideone.com/2rpXth
Делайте ваши тесты, господа.
j123123 12.06.2016 07:09 # 0
А как же выравнивание? UB будет. Надо через memcpy.
Нельзя просто так взять, и скастовать из char* в uint64_t*
bormand 12.06.2016 14:31 # 0
Можно же, стандарт разрешает. Указатель на char и другой указатель могут алиаситься, лишь бы выравнивания хватало...
bormand 12.06.2016 14:34 # +1
inkanus-gray 12.06.2016 16:08 # +4
Antervis 13.06.2016 04:47 # +1
> А как же выравнивание? UB будет. Надо через memcpy.
const uint64_t *p = (const uint64_t*)(s-s%sizeof(uint64_t));
fixed.
3.14159265 12.06.2016 20:51 # +2
bormand 09.01.2019 07:19 # 0
HoBorogHuu_nemyx 09.01.2019 08:02 # 0
bormand 09.01.2019 08:20 # 0
bormand 09.01.2019 08:41 # 0
bormand 09.01.2019 09:16 # 0
bormand 09.01.2019 21:54 # 0
З.Ы. Удачного разбора, ня. Распаковывает 7 гигабайт в секунду, лол (не SSE'шная всего 1.3 гига успевала).
guest8 09.01.2019 22:00 # −999
bormand 09.01.2019 22:11 # 0
guest8 13.05.2019 08:42 # −999
bormand 13.05.2019 10:49 # 0