Generatore di numeri primi nostalgici [chiuso]


16

Ricordi i bei vecchi tempi quando l'apertura di un semplice documento o di una pagina Web era dolorosamente lenta in quanto conteneva tutte le scarse risorse del tuo computer? E oggi, fare lo stesso è ancora più lento, nonostante il tuo processore sia centinaia di volte più veloce e abbia accesso a migliaia di volte più memoria?

Per simulare l'effetto del bloat negli attuali visualizzatori di documenti e applicazioni simili, scrivere un programma che presenta problemi di prestazioni visibili quando eseguito su macchine più potenti .

Per avere un compito comune per tutti, rendilo un generatore di numeri primi .

  • Il programma deve stampare numeri primi consecutivi, a partire da 2, ciascuno in una nuova riga e nient'altro. Dovrebbe farlo per sempre (o fino a esaurire la memoria). Come questo:
2
3
5
7
11
13
17
  • Dovrebbe esserci un ritardo tra la stampa di ogni riga, abbastanza da essere percepibile da un essere umano.

  • Questo ritardo dovrebbe essere più lungo man mano che la macchina su cui è in esecuzione il programma diventa più veloce. Più veloce è la macchina, più lento è il programma.

  • Non specificherò benchmark esatti in quanto potrebbe diventare soggettivo, ma ci dovrebbe essere una differenza percepibile dall'uomo nella velocità su due macchine diverse se c'è una differenza significativa tra le prestazioni delle due macchine.

  • La velocità del programma non deve essere monotonicamente decrescente su tutte le macchine esistenti mai create. Questo sarebbe difficile da specificare, e ancora più difficile da verificare. Mi fido del buon senso dei concorrenti su ciò che può essere considerato una prestazione significativamente diversa tra le macchine, ed è sufficiente per soddisfarlo.

  • Inoltre non specificherò esatti limiti di tempo superiore o inferiore, ma dovrebbe essere entro limiti ragionevoli, quindi per favore non ci sono giorni o anni tra la stampa di due righe.

  • Non avrò bisogno di funzionare su tutto, dall'Eniac ai giorni nostri, ma dovrebbe essere abbastanza generale, ad esempio, non è consentito dire che funziona solo su due tipi di CPU specifici e rileva specificamente il nome di una CPU specifica su cui funzionerà sempre più lentamente.

  • Il codice non dovrebbe fare affidamento sulla versione del compilatore o dell'interprete. Dovrebbe funzionare se la stessa versione del compilatore / interprete è installata su una macchina più lenta e più veloce, o anche se il codice binario / bytecode è compilato su una macchina e quindi eseguito su due macchine diverse.

  • Spiegare i principi di funzionamento del programma. Poiché sarà difficile riprodurre i risultati, la validità della risposta potrebbe dipendere dalla fattibilità del metodo.

Anche se mi sarebbe piaciuto che diventasse un concorso subdolo, purtroppo questo sito non è più "Programmazione di puzzle e code golf", ma semplicemente "code golf", quindi vince il codice più corto.


5
Più veloce è la macchina, più lento è il programma. Non vedo un modo semplice per renderlo un criterio oggettivo e verificabile
Luis Mendo,

1
@LuisMendo: vedo almeno due modi per farlo facilmente.
vsz

1
@vsz Il problema che vedo è la riproducibilità. Qualcuno afferma di aver testato su due macchine e di aver notato una differenza di velocità significativa come richiesto, ma non è possibile riprodurre quel comportamento sulle due macchine. Quindi la risposta è valida?
Luis Mendo,

1
Questo dovrebbe essere taggato con il castoro indaffarato ?
mbomb007,

2
Cosa consideri una "macchina più potente" ? Una macchina con le stesse specifiche ma più RAM è considerata più potente? Il numero di istruzioni che il processore esegue in un secondo? Tutti e due? Qualcos'altro?
Fatalizza il

Risposte:


4

Perl, 80 78 71 byte

-9 byte grazie a @Dada

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

Esegue il comando lscpue trova la velocità della CPU in MHz. Più veloce è la CPU, maggiore è il tempo che dorme tra le uscite, 1 secondo per ogni 1 MHz. Funziona su Ubuntu 14.04.5. Sulla mia macchina particolare, questo verifica ogni numero ogni 800 secondi (13 minuti, 20 secondi). Su macchine più veloci, questo può richiedere più di 50 minuti. Modificalo in sleep$a/400per ottenere qualcosa di molto più sano a scopo di test.


Riorganizzare un po 'il codice dà $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_per 71 byte.
Dada,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.