Pull to refresh

Comments 26

Спасибо за, как всегда, отличный материал)
А можешь посоветовать, на какие источники стоит подписаться на тему Go, на вроде Teiva Harsanyi из начала статьи?
Англоязычные?
Я подписан на golangweekly.com, слежу за reddit.com/r/golang, ну и статьи про Go часто проскакивают на Hacker News.
Еще можно следить за каналом News на российском Golang коммюнити Slack-е.
Спасибо
И всем, кто добавил ссылки ниже, тоже)

А если нарушить красоту и правила, и сделать часто аллокируемые переменные с буфферами глобальными (хотя бы с точностью до горутины), сколько ещё можно выиграть?

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

Не могу понять, почему так?
Идея в том что часть ваших горутин будут ожидать ответа от ОС и пока они это делают, другие могут поработать.
Я не адепт Go, поэтому поясните, пожалуйста, следующую вещь: почему современный язык предусматривает возможность писать код, который в зависимости от знания нюансов языка может давать разницу в перформансе в 20 раз?
Мне кажется это справедливо вообще для любого general purpose ЯП. Все что здесь написано можно было бы «натянуть» на любой другой язык, я считаю.

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


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

ерунда какая. конкурентное решение будет быстрее если есть I/O.
Надо уточнить, что речь про блокирующее I/O. На неблокирующем разницы не будет.
Я вас не понял.

Если у вас все IO блокирующее, то никакого ивентлупа (poll/select) вы не сделаете. Следовательно никакой конкурентности вы не получите.

Если под «обычным» решением мы понимаем простое однотредовое решение без использования файберов/зеленых тредов/корутин, то неблокирующее IO никак его быстрее не сделает.
Блокирующее I/O это то, которое возвращает управление только тогда, когда весь запрашиваемый блок данных был получен или уже не может быть получен.
Я понимаю, что такое блокирующее ио :). Яснее ваша позиция не стала.

Потому что супероптимизаторы никто в 21 веке ещё не написал. Немного трудная задача

по моему, «современный» нужно трактовать не как «современный», а как «недавно созданный», по моему №2, современного языка априори нет, по моему №3, современный язык должен давать фантастическую гибкость при разработки абстрактных структур… и вообще, минимизировать количество кода и количество возможностей выстрелить в ногу…

вот сегодня была задача на го… есть входный интерфейс, изначально известно — это json, при чем в 1 уровень, нет вложенных объектов или массивов, секс начался, когда при сведении, значение 1 (ИД, который везде проходил как integer), внезапно начал при сведении типов определяться как float64, при чем с плавоющей точкой в пределах программы вообще нед ни действий не объявлений… вот и пожалуйства… работа над одной задачой призвела до анализа всей программы, день пришлось провозиться чтобы все в порядок привести…

друг сегодня книгу у меня увидел (заходил в гости пива попить), говрит "*бать, анси Си — разве си сегодня кому то нужен?" (интересовался в комерческих целях) — отвечаю: — нужен, си — о*енный язык, но сложный… и правда…

смотрю на рожденные языки в диапазоне последных 10-ти лет, и ниодин не нашел, который бы не позволял создавать программы с неправильными адресациями, некорректными указателями и т.п… зачем тогда писать на «современных ЯП», если можно писать на си, или си++, но такие программы, покрытые тестами, обыычно еффективней, и поведение их максимально приближено к ожилаемому?

Очень интересный опыт, не хотите описать подводные камни го в отдельной статье?

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

Эммм… Rust?
Ранее мы отказались от конкурентности на уровне обработки линий,

Так линий или строк?
думаю, это неважно, так как ресурсы на создание го-рутины для обработки линии\строки намного выше, чем последовательная обработка нескольких линий\строк…

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

Подобные изменения — это уже не рефакторинг.

UFO just landed and posted this here
Sign up to leave a comment.