Aufgabe
Warten Sie bei jeder Art von Parallelisierung mehrere Perioden, bis eine Gesamtruhezeit von mindestens einer Minute (jedoch weniger als eineinhalb Minuten) erreicht ist.
Das Programm / die Funktion muss innerhalb von 10 Sekunden beendet werden und (auf irgendeine Weise und in irgendeinem Format) zwei Werte zurückgeben: die gesamte verstrichene Zeit und die gesamte ausgeführte Ruhezeit. Beide Zeitwerte müssen eine Genauigkeit von mindestens 0,1 Sekunden haben.
Dies ähnelt dem Konzept der Arbeitszeit : Ein Job, der 60 Stunden dauert, kann in nur 6 Stunden erledigt werden, wenn 10 Arbeiter den Job aufteilen. Hier können wir 60 Sekunden Ruhezeit haben, z. B. in 10 parallelen Threads, sodass nur 6 Sekunden erforderlich sind, um den gesamten Job abzuschließen.
Beispiel
Das Programm MyProgram erzeugt 14 Threads, jeder Thread schläft 5 Sekunden lang:
MyProgram
→ [5.016,70.105]
Die Ausführungszeit ist länger als 5 Sekunden, und die Gesamtruhezeit ist wegen des Overheads länger als 70 Sekunden.
Antworten:
Dyalog APL,
65272321 BytesDh:
Erläuterung:
⎕DL&¨9/7
: 9 Fäden abspinnen, die jeweils 7 Sekunden warten.⎕DL
Gibt die tatsächliche Wartezeit in Sekunden zurück, die dem Argument entspricht, das einige Millisekunden dauert oder gibt.⎕TSYNC
: Warten Sie, bis alle Threads abgeschlossen sind, und rufen Sie das Ergebnis für jeden Thread ab.(⌈/,+/)
: gibt die längste Ausführungszeit eines einzelnen Threads zurück (während dessen Ausführung alle anderen Threads beendet wurden, dies ist also die tatsächliche Laufzeit), gefolgt von der Summe der Ausführungszeit aller Threads.Probieren Sie es online!
quelle
Python 2, 172 Bytes
Dies erfordert ein Betriebssystem mit einer Zeitgenauigkeit von mehr als 1 Sekunde, um ordnungsgemäß zu funktionieren (mit anderen Worten, jedes moderne Betriebssystem). Es werden 8 Threads erstellt, die jeweils 9 Sekunden lang schlafen, was zu einer Echtzeit-Laufzeit von ~ 9 Sekunden und einer parallelen Laufzeit von ~ 72 Sekunden führt.
Obwohl die offizielle Dokumentation besagt, dass der
Thread
Konstruktor mit Schlüsselwortargumenten aufgerufen werden sollte, bin ich vorsichtig und verwende ohnehin Positionsargumente. Das erste Argument (group
) muss seinNone
, und das zweite Argument ist die Zielfunktion.nneonneo wies in den Kommentaren darauf hin, dass der Attributzugriff (zB
f.t
) kürzer ist als der Listenindexzugriff (zBt[0]
). Leider gehen in den meisten Fällen die wenigen dabei gewonnenen Bytes verloren, wenn ein Objekt erstellt werden muss, mit dem benutzerdefinierte Attribute zur Laufzeit erstellt werden können. Zum Glück unterstützen Funktionen benutzerdefinierte Attribute zur Laufzeit. Daher nutze ich dies aus, indem ich die Gesamtzeit imt
Attribut von speicheref
.Probieren Sie es online aus
Danke an DenkerAffe für -5 Bytes mit dem
exec
Trick.Vielen Dank an kundor für -7 Bytes, der darauf hingewiesen hat, dass das Thread-Argument nicht erforderlich ist.
Danke an nneonneo für -7 Bytes aus diversen Verbesserungen.
quelle
f()
und die letzten beiden Argumente bisThread
entfernen (wodurch 7 Zeichen entfernt werden) und die Verwendung vont.append(m()-n)
, um die Zuweisung einer lokalen Variablen zu vermeident
(5 Zeichen mehr als+=
.)t
mitt=[0]
, Anhängen durcht[0]+=m()-n
und Ersetzensum(t)
durcht[0]
.import threading as H,time as t
; Speichern Sie weitere zwei Bytes mitz=H.Thread
undmap(z.join,r)
. Speichern Sie weitere zwei Bytes, indem Sie die Gesamtzeit als AttributT.z+=m()-n
Bash + GNU-Dienstprogramme, 85
time
Erzwingt die Verwendung der ausführbaren Datei anstelle der eingebauten Shell, indem ein vorangestellt wird\
.Hängt an eine Datei an
j
, die zu Beginn leer oder nicht vorhanden sein muss.quelle
if [ $1 -lt 9 ];then { ./a $(( $1 + 1 )) &};sleep 7;fi
oder so? Wäre das gegen die Regeln oder etwas, was ich über die Spezifikation nicht verstehe? [bearbeiten; Ich habe die Anforderung für die Ausgabe verpasst. Oh, das macht es interessant!](($1<9))&&$0 $[$1+1]&sleep 7
Go - 189 Bytes
Vielen Dank @cat!
Ausgänge (ms): 160,9939 ms , 60001 ms (160 ms , um 60,001 Sekunden zu warten)
quelle
@Rob In some languages the obvious solution is already (close to) the shortest. Besides, one way to view code-golf challenges is finding the shortest solution in EACH language. Otherwise Jelly will win most of the time... So: go ahead.
bedeutet nicht, dass Sie nicht versuchen sollten , Ihre Antwort auf Golf zu spielen, aber dass es in Ordnung ist, wenn es nicht gewinnt. Können Sie bitte eine Golf-Lösung hinzufügen?tot
zu etwas ähnlichem wechselnq
.Bash
19611711493 BytesAktualisiert, um eine bessere Zeitgenauigkeit zu unterstützen, indem Vorschläge von @manatwork und @Digital Trauma sowie einige andere Raumoptimierungen integriert werden:
Beachten Sie, dass dies voraussetzt, dass die
j
Datei am Anfang nicht vorhanden ist.quelle
function s
→s()
,b=`date +%s`
→b=$SECONDS
,expr $t + $i
→$[t+i]
,`cat j`
→$(<j)
und in der Regel sehen Tipps für in Bash Golf spielen , wie es zu dieser reduzieren: pastebin.com/DDqUaDug5↵5↵5↵…
schreiben+5+5+5…
- dann laden alle direkt in die Arithmetik Auswertung und verschonen die zweite Schleife: pastebin.com/LB0BjDMZb=`date +%s`
→b=$SECONDS
Vorschlag.bash
bei der Ganzzahlarithmetik muss die gesamte Lösung neu geschrieben werden, um ein externes Tool für die Berechnung zu verwenden. Typischbc
: pastebin.com/eYFEVUuzJavaScript (ES6), 148 Byte
Verspricht, 9 Mal 7 Sekunden lang insgesamt 63 Sekunden zu warten (tatsächlich 63,43, wenn ich es versuche), aber tatsächlich dauert es nur 7,05 Sekunden in Echtzeit, wenn ich es versuche.
quelle
C, 127 Bytes (dreht die CPU)
Diese Lösung dreht die CPU, anstatt zu schlafen, und zählt die Zeit mithilfe der
times
POSIX-Funktion (die die CPU-Zeit misst, die vom übergeordneten Prozess und in allen auf Kinder wartenden Prozessen verbraucht wird).Es gibt 7 Prozesse aus, die sich jeweils 9 Sekunden lang drehen, und gibt die Endzeiten in C-Takten aus (bei den meisten Systemen sind 100 Takten = 1 Sekunde).
Beispielausgabe:
Das bedeutet 9,06 Sekunden Echtzeit und 63,47 Sekunden Gesamt-CPU-Zeit.
Für beste Ergebnisse kompilieren Sie mit
-std=c90 -m32
(erzwingen Sie 32-Bit-Code auf einem 64-Bit-Computer).quelle
PowerShell v4, 144 Byte
Sets
$d
gleich zuGet-Date
und löscht alle vorhandenen Auftragsprotokolle mitGet-Job | Remove-Job
. Wir durchlaufen dann eine Schleife1..20|%{...}
und führen bei jeder IterationStart-Job
den Skriptblock{$x=date;sleep 3;((date)-$x).ticks/1e7}
für den Job aus (dh, jeder Job führt diesen Skriptblock aus). Wir leiten diese Ausgabe an weiter>$null
, um das zurückgegebene Feedback (dh Jobname, Status usw.) zu unterdrücken.Der Skriptblock setzt
$x
aufGet-Date
, dannStart-Sleep
für3
Sekunden, nimmt dann eine neueGet-Date
Lesung vor, subtrahiert$x
, erhält die.Ticks
und dividiert durch1e7
, um die Sekunden zu erhalten (mit Genauigkeit).Zurück im Hauptthread
-S
drehen"Running"
wir uns in einer leerenwhile
Schleife , solange ein Job noch erledigt ist . Sobald dies erledigt ist, rufen wirGet-Job
Objekte für alle vorhandenen Jobs auf,Receive-Job
leiten diejenigen, an die STDOUT (dh was sie ausgeben),-join
die Ergebnisse zusammen mit STDOUT und leiten+
sie aniex
(Invoke-Expression
und ähnlicheval
). Dies gibt die resultierende Ruhezeit plus Overhead aus.Die letzte Zeile ist insofern ähnlich, als sie ein neues Datum erhält, den ursprünglichen Datumsstempel subtrahiert
$d
, den abruft.Ticks
und durch dividiert, um1e7
die Gesamtausführungszeit auszugeben.NB
OK, das ist also ein bisschen krumm von den Regeln. Anscheinend muss PowerShell bei der ersten Ausführung eine Reihe von .NET-Assemblys für die verschiedenen Thread-Vorgänge von der Festplatte laden, da sie nicht mit dem Standard-Shell-Profil geladen werden. Nachfolgende Ausführungen funktionieren einwandfrei, da sich die Assemblys bereits im Speicher befinden. Wenn Sie das Shell-Fenster lange genug im Leerlauf lassen, kann die integrierte Garbage Collection von PowerShell alle diese Assemblys entladen. Dies führt dazu, dass die nächste Ausführung beim erneuten Laden sehr lange dauert. Ich bin mir nicht sicher, wie ich das umgehen soll.
Sie können dies an den Ausführungszeiten in den folgenden Läufen ablesen. Ich startete eine neue Shell, navigierte zu meinem Golfverzeichnis und führte das Skript aus. Der erste Lauf war schrecklich, aber der zweite (sofort ausgeführt) hat gut funktioniert. Dann ließ ich die Shell einige Minuten im Leerlauf, damit die Garbage Collection vorbeikam, und dann ist dieser Lauf wieder langwierig, aber nachfolgende Läufe funktionieren wieder einwandfrei.
Beispiel läuft
quelle
Javascript (ES6),
212203145 BytesMit diesem Code werden beim Laden 10 Bilder mit einem Zeitintervall von jeweils genau 6 Sekunden erstellt.
Die Ausführungszeit ist geringfügig länger (aufgrund von Overhead).
Dieser Code überschreibt alles im Dokument!
Dies setzt voraus, dass Sie für die Backticks eine Einzelbyte-Codierung verwenden, die erforderlich ist, damit die Javascript-Engine nicht auslöst.
Alternativ, wenn Sie nicht 6 Sekunden warten möchten, finden Sie hier eine 1 Byte längere Lösung, die in weniger als einer Sekunde abgeschlossen ist:
Der Unterschied besteht darin, dass dieser Code 600 ms auf 100 Bilder wartet. Dies führt zu einem enormen Overhead.
Alte Version (203 Bytes):
Dieser Code erstellt 10 Iframes mit einem Zeitintervall von jeweils genau 6 Sekunden, anstatt 10 Bilder zu erstellen.
Originalversion (212 Bytes):
quelle
Rubin, 92
quelle
Javascript (ES6),
10892 BytesIch mache eine neue Antwort, da dies einen etwas anderen Ansatz verwendet.
Es erzeugt eine
setTimeout
enorme Menge von s, die fast alle mit 4 ms Abstand ausgeführt werden.Jedes Intervall beträgt 610 Millisekunden über insgesamt 99 Intervalle.
Es läuft normalerweise innerhalb von 610 ms, was einer Gesamtausführungszeit von etwa 60,5 Sekunden entspricht.
Dies wurde auf Google Chrome Version 51.0.2704.84 m unter Windows 8.1 x64 getestet.
Alte Version (108 Bytes):
quelle
Scratch - 164 Bytes (16 Blöcke)
Sehen sie in Aktion hier .
Verwendet eine Variable mit dem Namen 't' und ein Sprite mit dem Namen 's'. Das Sprite erstellt Klone von sich selbst, von denen jeder 8 Sekunden wartet, und erhöht eine Variable, die die gesamte Wartezeit taktet. Am Ende steht die gesamte Ausführungszeit und die gesamte Wartezeit (zum Beispiel
65.488 8.302
).quelle
Clojure,
135120111109 BytesFormatierte Version mit benannten Variablen:
Ausgabe (in Nanosekunden):
Geändertes Format. Vielen Dank, Adám. Möglicherweise habe ich diese Formatangabe in der Frage beim Lesen übersehen.
Geändert zu nanoTime für Golffähigkeiten.
Dank Cliffroot habe ich die wissenschaftliche Notation völlig vergessen und kann nicht glauben, dass ich sie nicht gesehen habe
apply
. Ich glaube, ich habe das in etwas benutzt, was ich gestern golfen, aber nie gepostet habe. Du hast mir 2 Bytes gerettet.quelle
7e3
anstelle von7000
undapply
anstelle von verwendenreduce
Rust,
257, 247 BytesIch benutze das gleiche mal wie Megos Python-Antwort.
Wirklich ist das einzige etwas kluge Bit, ii zu verwenden, um eine Dauer von 0 Sekunden zu erhalten.
Drucke:
Ungolfed:
Edit: Gute alte Schleife ist etwas kürzer
quelle
JavaScript (ES6, mit WebWorkers),
233215 BytesUPD: Die Art und Weise, wie ein Worker aus einer Zeichenfolge ausgeführt wird, wurde im Hinblick auf ursprungsübergreifende Richtlinien durch eine kompaktere und browserübergreifendere ersetzt. Funktioniert nicht in Safari, wenn das
webkitURL
Objekt noch vorhanden istURL
, und im IE.quelle
{ "message": "Uncaught SecurityError: Failed to construct 'Worker': Script at 'data:application/javascript,a%3Dnew%20Date()%3BsetTimeout(()%3D%3EpostMessage(new%20Date()-a)%2C5e3)' cannot be accessed from origin 'null'.", "filename": "http://stacksnippets.net/js", "lineno": 13, "colno": 45 }
Python 2, 130 Bytes
Dies ist eine Herleitung von Megos Antwort, aber es ist ausreichend anders, dass ich dachte, es sollte eine separate Antwort sein. Es wurde getestet, um unter Windows zu funktionieren.
Grundsätzlich werden 9 Threads abgezweigt, die 7 Sekunden lang schlafen, während die Eltern 8 Sekunden lang schlafen. Anschließend werden die Zeiten ausgedruckt. Beispielausgabe:
Misst unter Windows
time.clock
die Wandzeit seit dem ersten Aufruf.quelle
time.clock()
sich zwischen Windows- und UNIX / Linux-Plattformen unterschiedlich verhält .Perl 6,
7271 BytesMöglicherweise gibt es dafür einen kürzeren Weg
diese Ausgänge
quelle
Mathematica, 109 Bytes
Anonyme Funktion. Erfordert eine Lizenz mit mehr als 7 Unterkernen. Nimmt 9 Sekunden Echtzeit und 63 Sekunden Kernel-Zeit in Anspruch, ohne den Overhead zu berücksichtigen. Stellen Sie sicher, dass Sie die vorhergehenden Anweisungen nur einmal ausführen (damit der Kernel nicht neu gestartet wird). Testen:
quelle
Javascript (ES6), 105 Byte
Aktualisierte Version: 106 Bytes Entliehen von @Ismael Miguel, da er die großartige Idee hatte, die Schlafzeit zu verkürzen und die Intervalle zu erhöhen.
Javascript Ungolfed, 167 Bytes
quelle
d+=t()-s;if(!c)alert([t()-i,d])
können Sie schreibend+=t()-s;c||alert([t()-i,d])
, wodurch einige Bytes gespart werden. Auch, wenn Sie die Funktion entfernen und neu zu schreiben alles, können Sie mit meiner 92-Byte langen Lösung konkurrieren:for(c=8,i=(t=Date.now)(d=0);c--;)setTimeout((c,s)=>{d+=t()-s;c||alert([t()-i,d])},8e3,c,t())
. Und ja, dieser ist auch 92 Bytes lang.Java,
358 343 337 316313 Bytesund ungolfed
Bitte versuchen Sie es nicht zu Hause, da diese Lösung nicht threadsicher ist.
Bearbeiten:
Ich habe die Vorschläge von @A Boschman und @ Adám aufgegriffen, und jetzt dauert die Ausführung meines Programms weniger als 10 Sekunden, und es ist um 15 Byte kürzer.
quelle
Thread.
Aufrufe der Methode at the static sleep () nicht auslassen ? Wird dieses Programm nicht in etwas mehr als 10 Sekunden beendet und disqualifiziert?static long t
. Ich erwähne dies nur, weil in der Spezifikation steht "Beide Zeitwerte müssen eine Genauigkeit von mindestens 0,1 Sekunden haben."long
bevor dass
und fügen Sie,s
zu derstatic long t,i,s;
ein paar Bytes zu speichern.C (mit pthreads),
339336335 Bytesquelle
C90 (OpenMP), 131 Bytes (+ 17 für Umgebungsvariable) = 148 Bytes
Beispielausgabe:
Anmerkungen:
7091 erfolgt in Zyklen (100 / Sek.), Daher wurde das Programm 70 Sekunden lang ausgeführt
Könnte viel kürzer sein, wenn ich einen Weg finden würde, einen Timer außer omp_get_wtime () zum Laufen zu bringen, da ich dann auch die include-Anweisung entfernen könnte.
Führen Sie mit OMP_NUM_THREADS = 9 aus
quelle
Common Lisp (SBCL) 166 Bytes:
Dies erzeugt nur Threads, die sich im Ruhezustand befinden, und erhöht dann die benötigte Zeit auf atomare Weise. Dabei dreht sich eine äußere Schleife, die darauf wartet, dass die Gesamtzeit mehr als 60000 Ticks beträgt (dh 60s auf sbcl). Der Zähler wird in einer Liste gespeichert, da die Art der Orte, die atomic-incf ändern kann, begrenzt ist. Möglicherweise ist nicht genügend Speicherplatz vorhanden, bevor das Programm auf schnelleren Computern beendet wird.
Ungolfed:
quelle
Perl, 101 Bytes
Gabelt 7 untergeordnete Prozesse, von denen jeder 9 Sekunden wartet.
Beispielausgabe:
quelle
Groovy,
158143 ZeichenProbelauf:
quelle
Elixier, 168 Bytes
Probelauf:
Die Ausgabe ist die Gesamtwartezeit, gefolgt von der Laufzeit des Programms in Mikrosekunden.
Das Programm erzeugt 14
Task
Sekunden und wartet auf jeden von ihnen, indem es sie abbildet, und ermittelt dann die Summe ihrer verstrichenen Zeit. Es verwendet Erlang'stimer
zum Messen der Zeit.quelle
Haskell,
278271262246 Bytes!
misst die von der Aktion benötigte Zeita
(zweites Argument) und bezieht sichb
(erstes Argument) auf das Ergebnis.w
ist die Schlaffunktion.main
wird selbst gemessen und das Ergebnis gedruckt (print!...
).#
istreplicateM
, die gegebene Aktion N-mal zu wiederholen (undt
wegen Golf zurückzukehren).Innerhalb des gemessenen Teils
replicate 9 $ forkIO ...
schlafen 9 Threads ( ) für5^10
Millisekunden (9,765625 Sekunden) und veröffentlichen das Ergebnis (writeChan
) in einer vom Haupt-Thread (newChan
) erstellten Pipe , die die 9 Ergebnisse summiert und die Summe (getChanContents >>= print . sum . take 9
) ausgibt .Ausgabe:
quelle
Python 2, 132 Bytes
Verwendet einen Prozesspool, um 9 Prozesse zu erzeugen und jeden für 7 Sekunden schlafen zu lassen.
Gibt zuerst die gesamte akkumulierte Schlafzeit und dann die tatsächliche Laufzeit aus:
quelle
Rubin (mit
parallel
Edelstein),123116 BytesBearbeiten: Der "Time.now" -Referenz aus der Ruby-Antwort von Histocrat wurde hinzugefügt.
quelle
Matlab, 75 Bytes
Schnelle Erklärung:
parfor
Erstellt eine parallele for-Schleife, die über den Pool von Arbeitnehmern verteilt ist.tic
undtoc
die verstrichene Zeit messen (und sind meiner Meinung nach eine der am besten benannten Funktionen in MATLAB). Die letzte Zeile (ein Array mit der Gesamtschlafzeit und der verstrichenen Echtzeit) wird ausgegeben, da sie nicht mit einem Semikolon abgeschlossen wird.Beachten Sie jedoch, dass dies 9 vollwertige MATLAB-Prozesse erzeugt. Es besteht dann die Möglichkeit, dass dieses bestimmte Programm nicht innerhalb der auf Ihrem Computer zugewiesenen 10 Sekunden beendet wird. Ich denke jedoch, dass bei einer MATLAB-Installation, bei der außer der auf einem High-End-System mit SSD installierten Parallel Computing-Toolbox keine Toolboxes installiert sind, die Installation möglicherweise nur innerhalb von 10 Sekunden abgeschlossen werden kann. Bei Bedarf können Sie die Parameter optimieren, damit weniger Prozesse mehr schlafen.
quelle
b
liegt wahrscheinlich nur daran, dass Sie bereits etwas in Ihrem Arbeitsbereich hatten. Ich habe keine Probleme mit 2015bparfor q=b