Anton
Добрый день!
Я вчера дописал свой первый, относительно полезный по функциональности, пакет. Его суть заключается в том, что он позволяет найти контур полигона для обрисовки множества точек. Будучи новичком в Go, допускаю, что некоторые моменты и участки кода написаны не лучшим образом. Если не сложно, и есть время и желание, посмотрите, пожалуйста, и укажите на те недостатки и слабые стороны в коде, которые увидите.
Спасибо!
https://github.com/GiddeonWyeth/ConcaveHull_Golang
Oleg
Добрый день!
Я вчера дописал свой первый, относительно полезный по функциональности, пакет. Его суть заключается в том, что он позволяет найти контур полигона для обрисовки множества точек. Будучи новичком в Go, допускаю, что некоторые моменты и участки кода написаны не лучшим образом. Если не сложно, и есть время и желание, посмотрите, пожалуйста, и укажите на те недостатки и слабые стороны в коде, которые увидите.
Спасибо!
https://github.com/GiddeonWyeth/ConcaveHull_Golang
Исходники лучше в корне держать чтоб импорт был короче. Название пакета и папки желательно чтоб совпадало
Anton
Понял, учту, спасибо!
Anonymous
Добрый день!
Я вчера дописал свой первый, относительно полезный по функциональности, пакет. Его суть заключается в том, что он позволяет найти контур полигона для обрисовки множества точек. Будучи новичком в Go, допускаю, что некоторые моменты и участки кода написаны не лучшим образом. Если не сложно, и есть время и желание, посмотрите, пожалуйста, и укажите на те недостатки и слабые стороны в коде, которые увидите.
Спасибо!
https://github.com/GiddeonWyeth/ConcaveHull_Golang
Ещё из простых подсказок - пробежаться по файлам с помощью gofmt. Глаз зацепился за точки с запятой в некоторых строках.
Anton
это дурной тон?
Anton
хорошо)
вообще, я надеялся также на какие-то советы по улучшению производительности)
красота кода, конечно, тоже хорошо, но вторично)
Anonymous
И ещё types.go лучше разнести по разным файлам
Kirill
Kirill
никаких функций, только типы
Anonymous
Улучшение производительности? А что, текущей мало?
Anton
а функции типов в отдельный файл?
Anton
Anton
если можно быстрее, я бы не отказался
Anonymous
Текущая в смысле "на данный момент" :)
Anonymous
В point.go тип point и его методы так же и в grid.go
Kirill
Kirill
хоть и немного, но заметно, когда ей не пользуешься
Kirill
разрастается потом так незаметно файлик на 1500 строк и всё, туши свет, бросай гранату
Anton
дело в том, что если передать в этот алгоритм 2 с лишним миллиона пар координат, скорость удручающая становится)
Kirill
то есть — рефакторить придется
Anton
это к вопросу о производительности
Anton
возможно это нормально для такого объема данных, а возможно нет - я не знаю, к сожалению
Kirill
для начала ты бы написал это go-way
Kirill
а то это похоже на выхлоп конвертора
Kirill
что за вечные выделения в циклах?
Kirill
что за скобочки у if? что за ; в конце строк?
Kirill
писалось явно без знания, как делать нужно в go.
Anton
да, спасибо, на эти недостатки выше уже указали, в следующем пуше буду их исправлять
Nikolay
Добрый день!
Я вчера дописал свой первый, относительно полезный по функциональности, пакет. Его суть заключается в том, что он позволяет найти контур полигона для обрисовки множества точек. Будучи новичком в Go, допускаю, что некоторые моменты и участки кода написаны не лучшим образом. Если не сложно, и есть время и желание, посмотрите, пожалуйста, и укажите на те недостатки и слабые стороны в коде, которые увидите.
Спасибо!
https://github.com/GiddeonWyeth/ConcaveHull_Golang
не вижу unit-тестов в принципе. покрыть стоит, если важна производительность то написать бенчмарки, запускать с отключенным GC и посмотреть на эскейп анализ, по возможности убрать выделения памяти в хипе. смотрится с ключиком -gcflags -m
Kirill
ну вот замечания о постоянных выделениях памяти в цикле я не видел тут
Kirill
а они в нескольких местах тут.
Anton
а о каких конкретно выделениях памяти в циклах идет речь?
Kirill
https://github.com/GiddeonWyeth/ConcaveHull_Golang/blob/master/concaveHull/hull.go#L25
Kirill
(Point{})
Kirill
аж глаза от такого режет.
Anonymous
Может попробовать распаралелить как-нибудь
Anton
или как это правильно делается?
Anonymous
Не очень шарю в Go, но возможно стоит использовать указатели вместо копирования значений вовнутрь функций.
Nikolay
Anonymous
Anton
да
Anonymous
Nikolay
в point.go оформи пустую отдельно разово аля var EmptyPoint = Point{} и все
Nikolay
фейл, point.go нету, ну там где тип этот воткни
Anton
хорошо, я понял, спасибо большое за советы!
Anonymous
MAX_SEARCH_BBOX_SIZE_PERCENT
Это вроде в стиле C так называют глобальные переменные. Вообще, есть крутая штука golint, он много чего подскажет. Но это по форматированию кода а не по производительности.
Anton
так, значит golint, gofmt и -gcflags -m
Anton
отлично
Anton
сейчас все посмотрю)
Nikolay
Nikolay
со стандартной библиотеки
Nikolay
да я к тому что советы хорошо, но это больше рекомендации.
Anonymous
https://golang.org/src/net/http/status.go Тут констатны в camel case заданы
Anonymous
И каждый тип в свом отдельном файле описан
Anonymous
Мне кажется стоит прислушиваться к рекомендациям.
Nikolay
стоит, но это все со временем приходит. товарищ начал только изучение, сразу хвататься за все не стоит - постепенно лучше.
Anonymous
Согласен. golint в этом деле вообще хорошая штука. По крайней мере мне помогала с именованием переменных и областями видимости.
Anton
я что-то не нашел, а они мне во многом не очевидны)
Nikolay
а есть где-то пояснения всех тех сообщений, которые этот флаг выдает?
давай начнешь с простого. если в строчке есть слово heap то это значит будет аллоцирован кусок памяти в куче и потом память будет собрана GC. Если есть возможность избавится где-то от этого, то несколько ускорит это все. Еще функции которые инлайнятся повышают быстродействие, правила когда функа инлайнится или нет можешь погуглить. Фишка в том что вызов функции это несколько дорого, каждый раз стек и тд. Но главный совет не переусердствовать. Напиши бенчмарк, там еще хороший показатель можно вывести - кол-во аллокаций на операцию, чем их меньше, тем быстрее можно заставить работать код. Ну и наносекунды на операцию тоже можно попробовать снизить. Это все общие советы, применять их все надо взвешанно.
Nikolay
Есть еще профайлер, там использование цпу можно смотреть да и память тоже.
Anton
все, что выводит флаг gcflags -m является замечанием?
Anton
или же он просто выводит профайл
Nikolay
все, что выводит флаг gcflags -m является замечанием?
это результат работы эскейп анализатора при компиляции. данный флаг включает вывод че он насмотрел в коде если простым языком. на то, что смотрю я обычно - где выделение в куче и где есть инлайн функции. Этот анализатор решает где разместить обьект - в куче или на стеке, также решает эту функцию он заинлайнит или нет ну и всякое другое.
Daniel
смотреть это, добавлю, нет никакого смысла до этапа оптимизации. а этап оптимизации не должен случаться раньше этапа измерений
Nikolay
A.
Ребзь
A.
А хотя не
A.
Всем спасибо
nvkv
обращайся
серёжа
Всегда рады
Constantine️
who
а подскажите новичку, как правильно деплоить
сырцы или бинарники сразу собирать?
Aleksandr
билдануть, собрать образ докера, вылить на бой)
who
спасибо