Блог пользователя antofik

Автор antofik, история, 2 года назад, По-русски

Всем привет,

Так получилось, что мои 9-ти летние дети захотели учиться программировать и участвовать в соревнованиях, а я как айтишник, решил — раз учить своих, почему бы не сделать общедоступный курс. Да так, чтобы человек с нулевых знаний (2-3 класс школы) мог дойти до решения задач, а потом и научиться всем алгоритмам.

Идея следующая: я декомпозирую все знания на мельчайшие куски, и строю курс, постепенно вводя новые понятия. От "что такое мышка" до "что такое наследование" и что такое красно-чёрное дерево. Каждый урок длится в среднем 3-5 минут, и акцент часто на "понять", а не "зазубрить". За базовый язык программирования взят C#, т.к.: а) из семьи C-языков и позже будет проще перейти на С++ если надо б) легче учить чем С++ для совсем начинающих (не надо знать про память глубоко) в) достаточно быстрый (питон огранчен в этом плане) и простой.

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

https://infinite.education/view/путь_юного_программиста

P.S. Делалось всё изначально для себя, в свободное время и на чистом энтузиазме, поэтому прошу не пинать за баги, или ошибки — но буду рад дельным замечаниям. А если у кого-то есть желание присоедениться — скажем, создать ответвление по питону, С++ или просто по решению задач — буду только рад :) Курс можно расширять бесконечно в любом направлении

Буду рад любому фидбеку — особенно нужно ли такая штука обществу

Полный текст и комментарии »

  • Проголосовать: нравится
  • +109
  • Проголосовать: не нравится

Автор antofik, 11 лет назад, перевод, По-русски

Обнаружил интересное поведение в среде MS C# пока решал 415E - Машмох и операция реверс — добавление одной строки Console.Write("") неожиданно увеличило производительность на 30%.

Можно сравнить два решения 6429939 и 6429944, которые отличаются только одной этой строкой. Время выполнения для них соответственно 2105мс и 1777мс.

Несколько фактов:

  • вставка этой инструкции в начале программы не даёт эффекта
  • так же бесполезно оказывается вставить её непосредственно перед выводом результата
  • улучшение производительности заметно при больших объёмах данных (здесь ~1МБ)

Есть идеи?

UPDATE Вышеуказанные решения в данный момент стали работать подобным образом, что похоже на рандом. Но их "полная" версия до сих пор отличается более чем в два раза, что нельзя объяснить разбросом. 6430646 и 6430655

UPDATE2 Провёл ряд экспериментов, вот что получается:

  • в среде C# Mono проявляется тот же эффект
  • локально повторить не удаётся
  • отключение оптимизации с помощью атрибута MethodImpl приводит к нормальному исполнению программы
  • отключение оптимизации с помощью #pragma optimize( "", off ) не даёт никакого эффекта
  • замена Console.Write("") на Console.Out.Flush() или Console.In.Close() тоже даёт программе нормально выполняться
  • в одной из строк чтения данных по-ошибке использовалось лишнее приведение к списку, а потом к массиву Console.ReadLine().Split().Select(int.Parse).ToList().ToArray(). Убираем ToList() — и чудо, программа снова работает как положено (отдельно измерял время выполнения лишней процедуры — оно оказалось достаточно маленьким, и не объясняющим эффекта)
  • замена Interlocked.Exchange() на обычные операции присвоения так же приводит к нормальному выполнению программы

Возникает предположение, что операции чтения-записи могут блокировать Interlocked.Exchange, что каким-то образом возникает после оптимизаций компилятора. Поэтому эту функции следует применять с осторожностью. Непонятным остаётся что за оптимизации мог сделать компилятор, чтобы ввод-вывод смог заблокировать Interlocked.Exchange()

Исходники: подвисающее 6434408, без Interlock-a 6434414, без ToList() 6434416

Полный текст и комментарии »

  • Проголосовать: нравится
  • +11
  • Проголосовать: не нравится