Пишем функцию для поиска простых чисел и поэтапно оптимизируем её в двух направлениях.
Дата отправки отчёта:
1 июня 2017 г.
Задание выполнено: за
2 час. 30 мин.
Чему научился:
Посмотрел делегаты опять. Посмотрел процесс эволюции кода и оптимизации. Люблю оптимизировать.
Что было сложным:
Вроде бы ничего.
Комментарии:
Самое смешное началось, когда у 10 000 000 убрали 000 и поместили в другое место. После этого у меня разультаты стабильно стали почти равными (разница в 100 чисел). А до исправления разница была раза в 3 стабильно. У меня это вызвало приступ смеха. Вы только вдумайтесь - оптимизация алгоритма стала ненужна. Нужно было оптимизировать время вычисления производительности.
Хотя тут многие могут меня неправильно понять, типа быстрей тот, кто сам определяет, как и в чем считать. Но я хотел сказать, что похоже либо Компилятор оптимизирует, либо процессоры настолько крут, что ему по барабану такие оптимизации. Процессор и5-4443.
Когда же стали писать is_prime_each_by_3 и запускать, то я заметил, что числа различаются только в младшем разряде и тут я понял, что что-то пошло не так. Оказалось, что в find_primes неправильно написано if (is_prime__each_by_0(number)) { count_primes++; }
а надо if (is_prime(number)) { count_primes++; }
Вот так вот у меня возникло ложное представление о прогрессе и о своем превосходстве с понтовым процессором. Процессор оказался самый обычный.
Потом когда с корнем сделали, то я был в шоке. Я и не ожидал такого скачка. Думал примерно будет линейно расти. И вот как только люди придумывают такие оптмизации в матане? Я один раз for на while заменил в прошивке под контроллер и экономия памяти программ вышла порядка 53 или 56 байт, что для контроллера с 8кб тоже неплохо. Иногда и один байт решает. we.easyelectronics.ru/Asticon/istoriya-odnogo-bayta.html
Второй шок у меня был от is_prime_each_by_P. Я так и не понял, зачем нужно это все if (number == 2) { primes.Clear(); primes.Add(2); return true; } Однако по мере просмотра ролика выяснилось, что пропущена строка primes.Add(number);. А я это интуитивно ощутил, т.к. еще в начале говорилось, что будет строиться таблица заранее рассчитанных чисел, а добавления в список не было. Такие таблицы используются для работы с тригонометрическими функциями - таблицы синуса и косинуса, т.к. 8битному контроллеру на 16мгц довольно трудно считать их не имея математического сопроцессора или дсп блока.
Вобщем добил я до конца. Правда так и не понял, как работает тестирование функций. Почему сравнивается с is_prime_each_by_0? Она 100% рабочая?
Было бы интересно вебинар сделать по юнит тестированию. Все давно пишут, а я даже не читал и понятия не имею. Еще было бы неплохо сделать платные курсы по алгоритмам цифровых модуляций. Сколько я ни парился, а даже простую афск модуляцию двумя тонами на передачу не осилил. У меня еще есть исходники демодуляторов разных и тоже не разобрался. Да и инфы нет никакой.
Что сказать по этому уроку? Получился как отдельный курс прям. То ли я упорот в этот день, то ли курс и правда интересный вышел. Я не ожидал даже. Думал будет скучно, но выжать попугаев оказалось довольно интересно, хоть я и не понимал в этих алгоритмах. Спасибо преподу по алгоритмам в быдловузе 2011. Отбил все желание.
Научился: Познакомился с алгоритмами поиска простых чисел и со способами их оптимизации. Научился замерять время работы функции. Трудности: Создать решето Эратосфена. В инете нашел готовое решение, но там так интересно сделано, через индексы массива числа задаются, и в каких ячейках нули, те индексы не пишем... Я решил сделать по своему... может и зря. 1. Я попробовал добавить таймер. У меня получилось. Но метод, предложенный Евгением Витольдовичем удобнее, проще для понимания. Можно к нему добавить последнее найденное простое число.
2. Я запускаю два раза первую функцию is_prime_each_by_0 .... но опять же было интересно узнать о "запуске в середине секунды"...
3. "Он искал только четные числа... Я думал хоть кто-нибудь это заметит" ... Я заметил. Сразу видна подстава. Просто на вебинаре экшн, а я в записи смотрю, холодной головой думаю... (ну и опытный уже немножко)))
4. Способ, созданный на вебинаре перебирает куда быстрее, чем мой эратосфен, поэтому я не буду его показывать. (тем более это дополнительное задание). Ну а вообще всё работает.
5. Классный вебинар и..... такое чувство, что я его когда уже видел...