Мирон
он бинарнобезопасен
Vladislav
он бинарнобезопасен
и ты все эти закорючки из терминала спокойно читаешь?
Alexander
jsoniter кстати и быстрее в 2 раза. реально тупо быстрее
Мирон
мне он нужен чтобы выводилось на экран и в файл
Vladislav
а зачем выводить на экран если ты не собираешься это читать?
Мирон
кто сказал что не собираюсь
Мирон
у меня логи там
Vladislav
ну когда много бинарщины читается очень хорошо
ортем
ну когда много бинарщины читается очень хорошо
ты видишь бинарщину, он - блондинку в красном платье
Мирон
я вижу �
anhckie
почему в sql/db.execContext сыпется ошибкой такой запрос? SET @var1 = ?, @var2 = ?; INSERT INTO table_name (column1, column2) VALUES (@var1, @var2) ON DUPLICATE KEY UPDATE column1 = @var1, column2 = @var2; в консоли бд отрабатывает, а из приложухи Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ......
anhckie
пакет "database/sql"
Alexander
скорее всего один стейтмент должен быть. если хочешь попробовать с 2мя, то тебе точно надо либо брать соединение, либо открывать транзакцию - такова специфика
Alexander
а зачем это вообще делать?
anhckie
для реализации апсерта
anhckie
если записи нет - создать, если уже была - апдейтим
Alexander
db.Exec("INSERT INTO table_name (column1, column2) VALUES (?, ?) ON DUPLICATE KEY UPDATE column1 = ?", column2 = ?, var1, var2, var1, var2)
anhckie
так и делаю по итогу, но просто напрягает дублеж аргументов
anhckie
первое
Vladislav
а зачем тогда его апдейтить?
Alexander
хм)
anhckie
та оно и не проапдейтится по итогу) ну убрать можно, да
Кіт ✙
пытаюсь имплементировать у себя динамический роутинг. Регулярки из стд-либы откинул сразу, они слишком медленные (гиперскан не пробовал пока), поэтому написал своё миниатюрное решение, алгоритм которого состоит в следующем: Статичная часть (захардкоженная часть пути) и динамическая чередуются. У нас есть цикл, который сначала сравнивает префикс пути со статической частью, и потом бежит по оставшейся части пути до тех пор, пока не встретит слэш или конец строки. Как только встретил, обрезает префикс пути, где префикс - статическая и динамическая части. Гист - https://gist.github.com/fakefloordiv/7a5cdebe48223305093a20b40845a9de
Кіт ✙
ах да, забыл упомянуть: из требований - динамические части нужно схоронять в контекст под соответствующим именем
Кіт ✙
Вот результаты бенчмарков (сами бенчмарки также представлены в гисте). Меня не совсем устраивает medium и long кейсы (хотя всё ещё быстрее, чем регулярки). Не могли бы вы подсказать, как это можно было бы оптимизировать?
anhckie
что такое «динамический роутинг»?
Vladislav
ну и да, если заменить /{...}/ на /:.../ обрабатывать проще будет не нужно закрывашку искать, слеш служит закрывашкой или конец строки
Vladislav
просто про их медлительность - голосновное утверждение по сути, особенно в контексте сравнения с твоей реализацией
Кіт ✙
-benchmem добавь, в гисте у тебя internal замешан
да, пропустил немного. Но могу поклясться, что заменив на просто context, ничего не изменится
Кіт ✙
а есть бенчмарки в сравнении с теми же регулярками?
нема, но сейчас ещё раз накидаю с теми же кейсами, что и для своего матчера
Кіт ✙
Кіт ✙
обновил гист, добавил бенчмарки для регулярок. Результаты прикрепляю
Кіт ✙
регулярки всё же на длинных паттернах выигрывают, кстати. Надо будет гиперскан попробовать
Кіт ✙
кстати, по поводу интерналов - вот эта штука. Я просто взял дефолтный WithValue у контекста, и убрал оттуда рефлексию
Кіт ✙
обновил гист, добавил бенчмарки для регулярок. Результаты прикрепляю
так, там ошибочька в сэмплах регулярок. Забыл индикатор окончания строки добавить
Vladislav
скорее всего, из-за контекста
замени вот эти две козявки for i := range dynamicPart { if dynamicPart[i] == '/' { на if idx := strings.IndexByte(dynamicPart, '/'); idx != -1 { интересные результаты
Кіт ✙
*сделал так
Кіт ✙
чичас заодно гист обновлю
Vladislav
ну это потому что переделал, у меня в 3-6 раз ускорилось
Кіт ✙
ну это потому что переделал, у меня в 3-6 раз ускорилось
можешь, пожалуйста, показать, как это выглядит у тебя?
Vladislav
до
Vladislav
после
Vladislav
у тебя архитектурка другая
Vladislav
в плане могут быть забавные различия
Кіт ✙
бедный дсигнер...
Vladislav
Кіт ✙
кажись контекст опять слишком много жрёт НАДО ИСПРАВЛЯТЬ
Vladislav
да, контекст жиреет
Кіт ✙
а аллокации из-за того, что он по указателю хранится. Обидно
Vladislav
чесно говоря мне еще не нравится как делается перебор по статичным кускам
Vladislav
главное слово "перебор"
Кіт ✙
попробую убрать указатели
так, убрал. Вроде тесты сервера от такого не обосрались, значит, работает. Пора бенчмаркать
Vladislav
например если статики много, то наверное лучше будет потрошить динамику и чекать в мапе статики
Кіт ✙
например если статики много, то наверное лучше будет потрошить динамику и чекать в мапе статики
в каком плане "статики много"? Если она просто длинная - операция О(1) (по крайней мере, я надеюсь, что у сравнения строк такая асимптотика)
Кіт ✙
мда, убрав указатели, ничего не поменялось
Кіт ✙
(сверху - без указателей, снизу - с, разница - в пределах погрешности)
Кіт ✙
Кіт ✙
о, во, нашёл
Кіт ✙
сделал дженериком
Кіт ✙
теперь красиво
PaXton Global IT Training & Consulting Services
Hi
kostyaBro
сделал дженериком
53 и 68 строка. У key тип K должен быть, как я понимаю
kostyaBro
И output V
kostyaBro
Так оно ведь и так работает
а смысл тогда generic если можно не тот тип засунуть
Кіт ✙
а смысл тогда generic если можно не тот тип засунуть
А То интерфейс контекста требует, чтобы Valuе принимало и возвращало any