All streams
Search
Write a publication
Pull to refresh
-3
0
Send message

Игровые стримы смотрят по двум с половиной причинам:


  1. Практическая. Оценить игру перед покупкой. Понять, будет ли она тебе интересна и стоит ли внимания. Эдакая демо-версия игры, которую не надо скачивать и тратить время на её изучение.


  2. Развлекательная. Не ради конкретной игры, а ради стримера. Стример тут выступает в роли артиста развлекательного жанра. Есть любимые музыканты и любимые актёры, которые нравятся тем, как они поют или играют в кино. Со стримерами то же самое. И так же как музыканты и актёры, разные стримеры работают в разных жанрах и могут вообще не пересекаться по аудитории.


  3. Тоже развлекательная. Многосерийные стримы — это многосерийное кино. Их смотрят не только потому что актёры/стримеры хорош играют, но и потому что интересно, что будет дальше и чем всё закончится.



— Если кратко, "кинуть бабло стримеру" фактически не отличается от "кинуть бабло музыканту" — оба артисты развлекательного жанра.

Думалку отключать вредно. Функция легко могла называться iswspace. Там есть намного более страшные имена и ничего.

Об этом и говорю. Чтобы видеть ошибку (не важно, кто в ней виноват), надо забыть или не знать стандартную библиотеку С, в которой сэкономили на слове white внутри isspace.

Я не заметил бы ошибку, если бы функция назвалась iswhitespace. Но она называется так, как называется. ((c)==' ' || (c) == '\t') — примерно так я и представлял себе её реализацию. Авторы MC тоже.

В условии содержится логическая ошибка. На примере "пробела" она очевидна. Код уже неправильный, и рассматривать его поведение дальше на других наборах данных просто нет смысла. Сначала надо исправить.

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


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

Нормально ошибка ловится взглядом, но для этого, наверное, надо не знать стандартную библиотеку С или успеть за 20 лет её забыть.


Взгляд споткнулся как раз о isspace(c) && ('\n' != c). Про isspace прочитать ещё не успел, исходил из названия и персонального здравого смысла. Если символ пробельный (собственно пробел или, в крайнем случае, табуляция), то он не может быть одновременно переводом строки. Соответственно, объединение по И выглядит подозрительно. Я предположил, что, возможно, имелось в виду ИЛИ; а даже если нет, то тут в любом случае какая-то фигня.

Новую ОС раздавали бесплатно, да и сейчас втихаря раздают. Кому надо, перешёл.

WMP — плеер как плеер, работает, играет. У меня музыка лежит по папочкам-исполнителям-альбомам, он с ней замечательно справляется. Отказался от винампа, и что там ещё было, в пользу WMP незадолго до выхода Висты.


Если видео вдруг тоже открылось в WMP, то можно в нём и посмотреть. Единственная претензия к нему как к видеопроигрывателю — пауза не по пробелу, а по комбинации, которую невозможно запомнить.

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

Писать стоит в первую очередь для себя, для решения своих проблем. Это не бесполезная вещь и не в стол.


А если вещь приносит кому-то пользу — например, экономит силы и время — то это экономия денег в конечном счёте. А стало быть появляется коммерция.

Когда тебе платят за труд ― это коммерция. Когда ты свой труд раздаёшь ― это благотворительность.


Вот пишешь что-нибудь себе, решаешь свою конкретную практическую проблему. Потом смотришь ― получилось вроде неплохо, проблему решает, паровоз зависимостей не тянет и к основному проекту гвоздями не прибито. Можно выложить в общий доступ. Зачем? Тебе не жалко, а кому ещё вдруг пригодится. На этом можно остановиться.


[Глупая аналогия]Допустим, я не сантехник, но придумал способ легко отремонтировать протекающий сливной бачок. Могу рассказать об этом соседу и даже показать. Но и мысли не будет ходить рассказывать об этом всему дому.[/Глупая аналогия]

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


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

Не очень понял, зачем пиарить свой открытый проект. Звёздочки какие-то… Только если ради потенциальных денег, но тогда JetBrains правы, отказав в бесплатной лицензии.


Если же не ради денег, то чем меньше у проекта пользователей, тем меньше глупых вопросов, меньше запросов фич, которые тебе лично нахрен не сдались, и меньше багов в трекере. Хотите тоже использовать ― берите и молча используйте. Хотите фичу ― напишите. Под Линуксом не работает? ― ну вот и почините. Автор не нанимался решать чужие проблемы.

Какие ж тут понты? Не i9-9999K, не 64 Гб, SSD скромный ― для ОС и рабочих программ, видеокарты вообще нет. Обычная современная рабочая машинка, чтобы делала своё дело и не заставляла страдать. Два монитора ― это не понты, а удобно; а 27" ― недорого.

Проверил. Убрал тест Aggregate, добавил несколько с указателями из любопытства. На NET Core не проверял, оно у меня не установлено. Добавил Моно и x86.


Результаты забавные


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


  1. LegacyJit x64 отдал предпочтение методу с array.Length, вынесенному из условия цикла (540 нс против 770 нс). Но проверка на выход индекса за пределы массива есть в обоих случаях. Нихрена она не убрана.
  2. В других конфигурациях NET Framework-компиляторам пофиг, скорость одинаковая. Хотя RyuJit догадался убрать проверку в обоих случаях (они вообще идентичные с точностью до замены регистров). Оставил её только в варианте ForReverse. Поэтому без необходимости ходить по массиву в обратную сторону наверное не надо, хотя разница невелика (600 нс против 640 нс).
  3. Компилятор Mono x64 тоже выбрал вариант с вынесением array.Length из цикла (860 нс против 1040 нс). Так же и в Mono x86 (1800 нс против 1960 нс). Осталась там проверка на выход за пределы или нет, непонятно. Дизассемблер непривычный и без отображения меток. Вообще ХЗ что там происходит.
  4. Замена статического массива на экземплярный дала изменение только в одном пункте: немного ускорился For на Mono x64, но на общую картину это не повлияло.
  5. Моно генерирует какие-то бессмысленные портянки машинных инструкций, перетасовывая регистры взад-вперёд. Дизассемблер методов с развёрнутыми циклами сам разворачивается на несколько экранов. В результате чем сильнее цикл развёрнут, тем больше кода и всё медленнее. При том что для LegacyJit x64 это тест даёт лучший результат из всех возможных.
  6. Лучше таки использовать foreach и для скорости, и для наглядности, и писать быстрее, и негде ошибиться.
  7. Вариант с указателями тоже неплох (почему-то из трёх похожих лучше всего именно PtrA). Когда очень надо, все средства хороши.

И я про то же.


Текст ― это RAM: можно читать с любого момента, отвлекаться, слушать в фоне музыку, тут читать, тут не читать, тут рыбу заворачивали. Видео ― сел смотреть, сиди и смотри. Отвлёкся, пропустил фрагмент? А ты не отвлекайся, сиди и смотри. Сконцентрируйся.


Сколько бы в тексте ни было картинок, в видео их всё равно больше.

При всех преимуществах текста, у видео тоже есть два:


  1. Наглядность. Не надо тыкаться в IDE как слепой котёнок.
  2. Некоторое принуждение к дисциплине. Куски текста велик соблазн пропускать или читать по диагонали. Начал читать абзац, подумал, что вода, бросил, перешёл к следующему. Видео принуждает слушать всё целиком. Перемотать конечно можно, но т.к. не видно начало следующего абзаца, то непонятно, насколько перематывать, поэтому сидишь слушаешь всё и не лезешь впереди паровоза.

Запущу обязательно. Вечером.

https://blogs.msdn.microsoft.com/clrcodegeneration/2009/08/13/array-bounds-check-elimination-in-the-clr/


Advice 2: When possible, use “a.Length” to bound a loop whose index variable is used to index into “a”.

Как минимум раньше эта «оптимизация» приводила к обратному эффекту. Вместо явного (i < a.Length) JIT видел сравнение индекса с какой-то левой переменной и на всякий случай вставлял в код проверку на выход за границы массива.

Information

Rating
Does not participate
Location
Россия
Registered
Activity