Ностальгический генератор простых чисел [закрыто]


16

Помните старые добрые времена, когда открытие простого документа или веб-страницы было мучительно медленным, так как оно занимало все скудные ресурсы вашего компьютера? И сегодня делать то же самое еще медленнее, несмотря на то, что ваш процессор работает в сотни раз быстрее и имеет доступ к тысячам раз больше памяти?

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

Чтобы у каждого была общая задача, сделайте ее генератором простых чисел .

  • Программа должна печатать последовательные простые числа, начиная с 2, каждое в новой строке, и ничего больше. Стоит до этого навсегда (или пока не кончится память). Как это:
2
3
5
7
11
13
17
  • Между печатью каждой строки должна быть задержка, достаточная для восприятия человеком.

  • Эта задержка должна быть больше, поскольку машина, на которой работает программа, становится быстрее. Чем быстрее машина, тем медленнее программа.

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

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

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

  • Я не буду требовать, чтобы он работал на всем от Eniac до современности, но он должен быть достаточно общим, например, нельзя говорить, что он работает только на двух конкретных типах CPU, и определенно определяет имя одного конкретного CPU на котором он будет работать медленнее или быстрее.

  • Код не должен полагаться на версию компилятора или интерпретатора. Он должен работать, если одна и та же версия компилятора / интерпретатора установлена ​​как на более медленной, так и на более быстрой машине, или даже если двоичный / байт-код скомпилирован на одной машине, а затем запущен на двух разных машинах.

  • Пожалуйста, объясните принципы работы вашей программы. Поскольку будет трудно воспроизвести результаты, достоверность ответа может зависеть от осуществимости метода.

Хотя мне бы хотелось, чтобы он превратился в закулисное соревнование, к сожалению, этот сайт уже не «Программирование головоломок и Code Golf», а просто «Code Golf», поэтому выигрывает самый короткий код.


5
Чем быстрее машина, тем медленнее программа. Я не вижу простого способа сделать это объективным, поддающимся проверке критерием
Луис Мендо

1
@LuisMendo: я вижу по крайней мере два способа легко сделать это.
вс

1
@vsz Проблема, которую я вижу, это воспроизводимость. Кто-то говорит, что они тестировали на двух машинах и заметили существенную разницу в скорости по мере необходимости, но вы не можете воспроизвести это поведение на двух ваших машинах. Так верен ли ответ?
Луис Мендо

1
Должно ли это быть помечено как занятый бобер ?
mbomb007

2
Что вы считаете «более мощной машиной» ? Машина с такими же характеристиками, но большим объемом оперативной памяти считается более мощной? Сколько инструкций процессор выполняет в секунду? И то и другое? Что-то другое?
Fatalize

Ответы:


4

Perl, 80 78 71 байт

-9 байт благодаря @Dada

$_++;`lscpu`=~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while$_++

Запускает команду lscpuи находит скорость процессора в МГц. Чем быстрее процессор, тем больше он спит между выходами, 1 секунда на каждые 1 МГц. Работает на Ubuntu 14.04.5. На моей конкретной машине это проверяет каждое число каждые 800 секунд (13 минут, 20 секунд). На более быстрых машинах это может занять более 50 минут. Измените это, чтобы sleep$a/400получить что-то намного более вменяемое для целей тестирования.


Небольшая перестановка кода дает $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_для 71 байта.
Дада
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.