Nostalgiczny generator liczb pierwszych [zamknięte]

16

Pamiętasz dawne dobre czasy, kiedy otwieranie prostego dokumentu lub strony internetowej było boleśnie powolne, ponieważ pochłaniało wszystkie skromne zasoby komputera? A dzisiaj robienie tego samego jest jeszcze wolniejsze, mimo że procesor jest setki razy szybszy i ma dostęp do tysięcy razy więcej pamięci?

Aby zasymulować efekt wzdęcia w obecnych przeglądarkach dokumentów i podobnych aplikacjach, napisz program, który ma widoczne problemy z wydajnością, gdy jest uruchamiany na mocniejszych urządzeniach .

Aby mieć wspólne zadanie dla wszystkich, uczyń go generatorem liczb pierwszych .

  • Program musi drukować kolejne liczby pierwsze, zaczynając od 2, każdy w nowej linii i nic więcej. Powinno to być na zawsze (lub do wyczerpania się pamięci). Lubię to:
2
3
5
7
11
13
17
  • Pomiędzy drukowaniem każdej linii powinno być opóźnienie wystarczające, aby było widoczne dla człowieka.

  • To opóźnienie powinno być dłuższe, ponieważ maszyna, na której działa program, staje się szybsza. Im szybsza maszyna, tym wolniejszy program.

  • Nie będę określać dokładnych testów porównawczych, ponieważ mogą one stać się subiektywne, ale powinna istnieć zauważalna dla człowieka różnica prędkości na dwóch różnych komputerach, jeśli istnieje znacząca różnica między wydajnością tych dwóch komputerów.

  • Szybkość programu nie musi monotonicznie spadać na wszystkich istniejących maszynach, jakie kiedykolwiek stworzono. Trudno byłoby to określić, a jeszcze trudniej zweryfikować. Ufam zdrowemu rozsądkowi uczestników co do tego, co można uznać za znacznie inną wydajność w porównaniu do maszyn, i to wystarczy, aby to zaspokoić.

  • Nie będę również określać dokładnych górnych ani dolnych limitów czasowych, ale powinno to być w rozsądnych granicach, więc nie ma dni ani lat między drukowaniem dwóch wierszy.

  • Nie będę wymagał, aby działał na wszystkim, od Eniaca do współczesności, ale powinien być dość ogólny, na przykład nie można powiedzieć, że działa tylko na dwóch określonych typach procesorów i konkretnie wykrywa nazwę jednego konkretnego procesora na którym będzie działał wolniej lub szybciej.

  • Kod nie powinien opierać się na wersji kompilatora lub interpretera. Powinien działać, jeśli ta sama wersja kompilatora / interpretera jest zainstalowana zarówno na wolniejszej, jak i szybszej maszynie, a nawet jeśli kod binarny / bajtowy jest skompilowany na jednym komputerze, a następnie działa na dwóch różnych komputerach.

  • Wyjaśnij zasady działania programu. Ponieważ odtworzenie wyników będzie trudne, ważność odpowiedzi może zależeć od wykonalności metody.

Chociaż wolałbym, żeby stał się zawziętym konkursem, niestety ta strona nie jest już „Programowaniem zagadek i Code Golf”, ale po prostu „Code Golf”, więc wygrywa najkrótszy kod.

vsz
źródło
5
Im szybsza maszyna, tym wolniejszy program. Nie widzę łatwego sposobu, aby uczynić to obiektywnym, weryfikowalnym kryterium
Luis Mendo,
1
@LuisMendo: Widzę co najmniej dwa sposoby na łatwe zrobienie tego.
vsz
1
@vsz Problem, który widzę, to odtwarzalność. Ktoś twierdzi, że przetestował na dwóch komputerach i zauważył znaczącą różnicę prędkości, jeśli jest to wymagane, ale nie można odtworzyć tego zachowania na dwóch komputerach. Czy odpowiedź jest prawidłowa?
Luis Mendo,
1
Czy to powinno być oznaczone bobrem zajętym ?
mbomb007,
2
Co uważasz za „mocniejszą maszynę” ? Czy maszynę o takich samych specyfikacjach, ale z większą pamięcią RAM, uważa się za wydajniejszą? Liczba instrukcji, które procesor uruchamia w ciągu sekundy? Obie? Coś innego?
Fatalize

Odpowiedzi:

4

Perl, 80 78 71 bajtów

-9 bajtów dzięki @Dada

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

Wykonuje polecenie lscpui znajduje prędkość procesora w MHz. Im szybszy procesor, tym więcej czasu śpi między wyjściami, 1 sekunda na każde 1 MHz. Działa na Ubuntu 14.04.5. Na mojej konkretnej maszynie testuje każdą liczbę co 800 sekund (13 minut, 20 sekund). Na szybszych maszynach może to trwać ponad 50 minut. Zmień to, aby sleep$a/400uzyskać coś znacznie bardziej rozsądnego do celów testowych.

Gabriel Benamy
źródło
Trochę $_++;przestawienie kodu daje lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_dla 71 bajtów.
Dada,