@nakem

Когда использование Cgo оправданно?

Все вокруг ругают Cgo, но он достаточно популярен. Я понимаю, что есть кейсы, когда cgo просто необходимо использовать, но в каких кейсах следует использовать cgo для улучшения производительности. И вообще существуют ли подобные кейсы.
  • Вопрос задан
  • 320 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Основной недостаток использования Cgo - это снижение производительности.
Вызовы C/C++ достаточно затратны по ресурсам, т.к. C ничего не знает о данных в Go и для вызова C необходимо полностью сохранять все регистры и переключать стек, за счёт этого и возрастают накладные расходы, соответственно снижается производительность.

Использование Cgo имеет смысл, когда есть объёмные библиотеки написанные на C/C++, которые можно использовать. При этом написание кода на чистом Go намного затратнее, чем использование этих библиотек с Cgo.

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

У меня был подобный кейс на Perl, но принцип тот же.
При скачивании HTML страниц размер занимаемой RAM скриптом постоянно увеличивался и в итоге "съедал" всю память на сервере.

Задача скрипта была скачивать HTML страницы, извлекать из них все ссылки на внешние ресурсы.
Я принял решение и написал функцию на С, которая выкачивала страницу, извлекала ссылки, очищала память и возвращала в Perl уже готовый список ссылок. Скрипты перестали постоянно "пухнуть", их можно было запустить в несколько раз больше по количеству на том же сервере + производительность стала явно выше.

В общем всё сильно зависит от задачи, но, думаю, более 90% кейсов будет связано с тем, что намного дешевле использовать готовую библиотеку C/C++ с Cgo, чем переписать эту библиотеку на чистом Go.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Когда оправдано, на своём примере - использование библиотек на C.

Есть у нас оборудование, к которому идут проприетарные библиотеки на C для управления им. Реверсинженерить их было затратно. Соответвенно, cgo позволил бы использовать эти библиотеки в сервисе на go с минимальными затратами.
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
В описании же пакета прямо сказано
Cgo enables the creation of Go packages that call C code.

Ни слова про производительность.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы