Как стать автором
Обновить
4
0
Роман @zolroman

Пользователь

Отправить сообщение

судя по статье, у них +4 новых пользователя. даже имена есть)

Очень странная статья, в духе:

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

Удивительный результат - побеждает скальпель. Вот только в чем тут полезность статьи? Не использовать для задачи то, что для нее не подходит? Это было понятно и без бэнчмарков.
Не понимаю, откуда плюсы у этой статьи.

Точно. Если вам не важны стоимость и время разработки, что же, это просто не ваш кейс, у вас всё по-другому.

Вопрос в том, какую задачу вы решаете этим кодом.

Спасибо за критику, постараюсь ответить:

  1. Затраты времени на сборку мусора я действительно не учитывал, не уверен, что бенчмарк такое умеет, если расскажете как - буду признателен. Косвенно их можно оценить через объем выделенной памяти, он есть в колонке Allocated.

  2. Вот метрики предложенного вами метода (я назвал его Simple)

По производительности он что-то среднее между Split и Memory, для меня он читается хуже. Вкусовщина? возможно, но как минимум строк в нем больше) И переделать в список его будет уже и не так просто, не 2 строчки дописать.

Я бы, все же, остановился на Memory.

По выбору алгоритма: если рассматривать какой-то очень простой алгоритм, на 1 цикл, то тут и говорить не о чем: написать быстро, а в случае чего и выбросить не жалко. Моя статья именно о достаточно сложных алгоритмах.

Так в этом и вся соль, заказчик не знает что ему потребуется через неделю, месяц, год.

Потому и подход такой, аджаил)

Split в NET 1 вообще был?

Важно что он есть сейчас, и сейчас мы можем его использовать

Запрещаю? Ни в коем случае!

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

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

В статье как раз есть пример подобных изменений: сначала нам было нужно только 1 слово, а потом список самых длинных.

Если предусмотреть заранее такое изменение, и писать сразу под список, то придётся писать гораздо более сложный алгоритм, и работать он будет медленнее чем для одного слова. И ещё не факт что в дальнейшем нам вообще он потребуется.

Хороший ли это подход? На мой взгляд - нет. Я лучше напишу код который решает текущую задачу, но напишу его так, чтобы в дальнейшим было легко его править.

Не хочу быть неправильно понятным, так что сразу оговорюсь : это не значит что я считаю что не надо заранее выяснять требования, продумывать архитектуру. Архитектура важна, и она должна предусматривать изменения.

вы просто обязаны это сделать

Вот тут я с вами не согласен.

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

Например, я не вижу ни одной причины не использовать Memory.Split вместо string.Split в данном случае, это необходимая оптимизация.

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

И стоит делать осознанный выбор между стоимостью разработки и скоростью работы алгоритма для каждой конкретной ситуации.

Я никогда не сравнивал TimSort и Jump.

Разница между Jump и связкой Split().MaxBy() в том, что метод Jump вам придется написать, протестировать, поддерживать, а Split и MaxBy уже есть в системе.

Для Jump тоже есть своя ниша, он не бесполезен. Но, затраты на его написание и поддержку должны быть оправданы, только и всего.

Мы обсуждаем с вами две разные проблемы:

Вы рассказываете о том, что этот код можно ускорить (с чем я абсолютно согласен)

Я же пытаюсь рассказать про реализацию бизнес-задач, где, зачастую, стоимость поддержки кода гораздо важнее скорости его работы.

Что будет с вашим супер оптимальным алгоритмом, когда изменятся требования к задаче? Вам придется его выбросить и написать новый. Новый тоже будет очень быстр, я не сомневаюсь, вот только на разработку вы потратите значительно больше времени.

И да, в каком-то случае оно будет стоить того, но далеко не всегда.

Сплит напрямую создает массив строк

Но ведь про это написано в статье)

И там же предложен альтернативный вариант с Memory, и он не создает строки, так же, как и озвученный вами StringTokenizer.

В чем тогда отличия? Почему один детский, а второй нет?

Переписывать придётся много раз, потому что требования будут меняться много раз.

И вопрос только в том, на сколько легко вы сможете адаптировать свой код под новые требования.

По-хорошему, проводят нагрузочное тестирование, находят узкие места и оптимизируют именно их.

Использование более быстрого алгоритма в 1 месте не гарантирует что система начнёт работать быстрее.

Спасибо за отзыв, и за плюсы!

Если я не так понял ваш посыл, и, на самом деле, мы сходимся во мнении, то это замечательно! И я прошу прощения если где-то неправильно передал ваши слова.

Я написал эту статью, потому что хочу явно прояснить некоторые моменты, для себя, и для тех, кто, возможно, так же, как и я понял вашу статью, и для тех кто может воспринять её как руководство к действию.

вы пишите: "Всё зависит от контекста, в котором будет работать алгоритм", но не даёте тот самый контекст для задачи. И, по умолчанию, я воспринял это в контексте бизнес задачи.

 Я чётко обозначил проблему использования стандартных методов при решении задач на собеседованиях и при выдаче результатов на сервисах вроде StackOverflow. 

Я не увидел в статье упоминания того, что это задача для собеседований.

ни алгоритмы, ни современность ЯП, ни ваши зазубренные знания стандартных методов напрямую не оказывают влияния на качество вашего кода. Всё зависит от того - как вы всем этим научитесь пользоваться.

Со вторым предложением я полностью согласен, без умения пользоваться никакой ЯП не поможет. А вот с первой частью - совсем нет!

Что полностью соответствует финалу вашей статьи

Совсем нет, я пытался высказать противоположное мнение! Именно современные ЯП и знание стандартных методов могут сильно улучшить качество кода. А вот использование алгоритмов может сделать код сложнее в поддержке.

Возникает ощущение, что использование самописных алгоритмов обладает абсолютным преимуществом над использованием готовых реализаций

Только у малопосвященных в тему.

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

Стандартные методы сами по себе являются специальными реализациями определенных алгоритмов

Ну с этим трудно спорить)

Если вам показалось, что я во всех случаях отговариваю пользоваться самописными алгоритмами из-за их сложности, то это не так. При написании библиотек/фреймворков они могут быть очень полезны и востребованы, я рассматривал контекст именно бизнес задач.

Если сократить мою статью до одного предложения:

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

Да, вы правы, так будет лучше. По скорости разница не очень большая, а вот памяти в 2 раза меньше расходует.

Есть ощущение, что оценка задачи и сроки - не одно и то же.
если задача оценена в 2 дня, это не значит что через 2дня она будет готова.

Планируется ли поддержка C#?

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность