1 초 정도 기다립니다 – 10 초 안에


69

태스크

모든 유형의 병렬 처리를 사용하여 최소 1 분 (1 분 반 미만)의 총 수면 시간 동안 여러 기간을 기다리십시오.

프로그램 / 기능은 10 초 이내에 종료하고 총 경과 시간과 총 실행 된 휴면 시간의 두 가지 값을 어떤 형식 으로든 반환해야합니다. 두 시간 값 모두 0.1 초 이상의 정밀도를 가져야합니다.

이것은 인력 시간 개념과 유사합니다. 60 명의 시간이 걸리는 작업은 10 명의 근로자가 작업을 분할하면 6 시간 만에 완료 될 수 있습니다. 여기서 10 개의 병렬 스레드에서 60 초의 휴면 시간을 가질 수 있으므로 전체 작업을 완료하는 데 6 초만 소요됩니다.

예

MyProgram 프로그램 은 14 개의 스레드를 작성하며 각 스레드는 5 초 동안 휴면 상태입니다.

MyProgram → [5.016,70.105]

실행 시간이 5 초 이상이고 총 절전 시간이 오버 헤드로 인해 70 초 이상입니다.


2
나는 질문을 여러 번 읽었고 그것을 얻지 못했습니다. 당신은 조금 명확하게 할 수 있습니까? 왜 "10 초"와 "70 초"의 지연이 발생합니까? 이 모든 시간은 어떤 관계입니까?
— Luis Mendo

3
몇 개의 스레드가 병렬로 실행될 것이라고 생각할 수 있습니까?
— 마일

3
출력 시간에 어떤 정밀도가 필요합니까?
— edc65

20
이것이 모든 골프 언어 작가들이 자신의 작품에 멀티 스레딩을 추가하기 위해 미친 대시에 참여하게 될지 궁금합니다.
— Adám

3
아, 제대로 구현 된 슬립 메소드는 코어를 사용하지 않아야하므로 스레드 수가 (가상) 프로세서 수를 초과 할 수 있습니다.
— Adám

답변:


15

Dyalog APL, 65 27 23 21 바이트

(⌈/,+/)⎕TSYNC⎕DL&¨9/7

즉 :

      (⌈/,+/)⎕TSYNC⎕DL&¨9/7
7.022 63.162

설명:

  • ⎕DL&¨9/7: 9 개의 스레드를 분리합니다. 각 스레드는 7 초 동안 대기합니다. ⎕DL대기에 소요 된 실제 시간을 초 단위로 반환합니다.이 인수는 인수가 주거나 몇 밀리 초가 걸리는 것과 같습니다.
  • ⎕TSYNC: 모든 스레드가 완료 될 때까지 기다렸다가 각 스레드에 대한 결과를 가져옵니다.
  • (⌈/,+/): 하나의 단일 스레드의 가장 긴 실행 시간 (다른 모든 스레드가 실행 된 동안 실행 시간이므로 실제 런타임 임)과 모든 스레드의 실행 시간 합계를 반환합니다.

온라인으로 사용해보십시오!


23:59:57에 실행되면 작동하지 않습니다. 그러나, 당신은 올바른 길을 가고 있습니다 ... 당신이 이미 가장 짧은 동안, 당신은 다른 40 바이트 멀리 골프 수 있습니까?
— Adám

1
@ Adám : 아니요, 그러나 38 바이트를 멀리 떨어 뜨릴 수 있습니다. 나는 이것이 처음으로 왜 이것을 생각하지 않았는지 모르겠다.
— marinus

당신은 간다. 확인 표시가 나타날 때까지 6 바이트 만 추가하십시오. 당신이해야 할 세 가지도 꽤 분명하여 각각 1, 2 및 3 바이트를 절약합니다.
— Adám

숫자 1과 3을 찾았습니다. 구현 2만큼이나 숫자 2는 실제로 골프가 아닙니다.
— Adám

2 번 : 인수가 필요하지 않으므로 tfn 본문으로 만드십시오.
— Adám

18

파이썬 2, 172 바이트

import threading as H,time as T
m=T.time
z=H.Thread
s=m()
r=[]
def f():n=m();T.sleep(9);f.t+=m()-n
f.t=0
exec"r+=[z(None,f)];r[-1].start();"*8
map(z.join,r)
print m()-s,f.t

이를 위해서는 1 초 이상의 시간 정밀도를 가진 OS (즉, 최신 OS)가 필요합니다. 각각 9 초 동안 휴면 상태 인 8 개의 스레드가 생성되어 ~ 9 초의 실시간 런타임과 ~ 72 초의 병렬 런타임이 발생합니다.

비록 공식 문서가 말한다 Thread생성자 키워드 인수로 호출 할 필요가 나는 바람에주의를 던져 어쨌든 위치 인수를 사용합니다. 첫 번째 인수 ( group)는이어야 None하고 두 번째 인수는 대상 함수입니다.

nneonneo는 주석에서 속성 액세스 (예 :) f.t가 목록 인덱스 액세스 (예 :) 보다 짧다 는 의견을 지적했습니다 t[0]. 불행히도, 대부분의 경우, 런타임에 사용자 정의 속성을 생성 할 수있는 객체를 생성해야하므로이 작업을 통해 얻은 몇 바이트가 손실됩니다. 다행히, 함수는 런타임에 사용자 정의 속성을 지원, 그래서 총 시간을 절약하여이를 악용 t의 속성 f.

온라인으로 사용해보십시오

exec트릭을 사용하여 -5 바이트의 DenkerAffe에게 감사드립니다 .

스레드 인수가 필요하지 않음을 지적하여 -7 바이트에 대한 kundor 덕분입니다.

기타 개선으로 -7 바이트의 nneonneo 덕분에.


에 대한 인수 f()와 마지막 두 개의 인수를 Thread제거 하여 (따라서 7 개의 문자 제거) t.append(m()-n)로컬 변수를 할당하지 않도록 t사용하여 (2보다 5자를 더 많이 사용 하여) 2 바이트를 절약 할 수 있습니다 +=.
— Nick Matteo

초기화 : 그리고 당신은 시간의 목록 대신 합을 유지하여 다섯 가지 이상을 절약 할 수 있습니다 t에 t=[0]의한 APPEND를 교체 t[0]+=m()-n하고, 교체 sum(t)에 의해 t[0].
— Nick Matteo

스레드 이름은 생략 할 수 있습니다.
— pppery

@ppperry : 후속 위치 인수를 사용해야 할 필요는 없습니다 (그러나 이전 주석에서 언급했듯이 실제로이를 제거 할 수 있습니다)
— Nick Matteo

import threading as H,time as t; 를 사용하여 3 바이트를 저장하십시오 . z=H.Threadand 를 사용하여 다른 두 바이트를 저장하십시오 map(z.join,r). (예를 들어 속성으로 총 시간을 보관 한하여 다른 2 바이트를 저장 T.z+=m()-n)
— nneonneo

11

배쉬 + GNU 유틸리티, 85

\time -f%e bash -c 'for i in {1..8};{ \time -aoj -f%e sleep 8&};wait'
paste -sd+ j|bc

time접두사 a로 시작하여 쉘 내장 대신 실행 파일을 강제로 사용 합니다 \.

j시작시 비어 있거나 존재하지 않아야 하는 파일에 추가 합니다.


포크 스크립트는 어떻습니까? if [ $1 -lt 9 ];then { ./a $(( $1 + 1 )) &};sleep 7;fi아니면 그런가요? 규칙에 위배되거나 스펙에 대해 이해하지 못하는 것이 있습니까? [편집하다; 출력 요구 사항을 놓쳤습니다. 오, 그게 재미 있어요!]
— Dewi Morgan

1
@DewiMorgan 예, 출력 요구 사항이 조금 더 어려워집니다. 제안하신 내용은 다음과 같습니다.(($1<9))&&$0 $[$1+1]&sleep 7
— Digital Trauma

9

이동-189 바이트

감사합니다 @ 고양이!

package main
import(."fmt";."time");var m,t=60001,make(chan int,m);func main(){s:=Now();for i:=0;i<m;i++{go func(){Sleep(Millisecond);t<-0}()};c:=0;for i:=0;i<m;i++{c++};Print(Since(s),c)}

출력 (ms) : 160.9939ms, 60001 (160.60 초 대기 60.001 초)


1
안녕하세요, PPCG에 오신 것을 환영합니다! 이 의견은 @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., 당신이 안 것을 의미하지 않는다 하려고 골프에 대한 답을하지만 OK라고는 승리하지 않는 경우. 골프 솔루션을 추가 할 수 있습니까?
— NoOneIsHere6

죄송합니다. 편집 내용을 읽었습니다. 골프의 경우 줄 바꿈과 공백을 제거하거나 tot다음과 같이 변경할 수 q있습니다.
— NoOneIsHere6

@NoOneIs 여기, 그 변수에 대해 완전히 간과했습니다! 또한 m과 t를 함께 때렸습니다.
— Rob

1
codebeautify.org/javaviewer - 작게하다 클릭
— 고양이


8

배시 196 117 114 93 바이트

@manatwork 및 @Digital Trauma의 제안 사항과 몇 가지 다른 공간 최적화 기능을 통합하여 더 나은 시간 정밀도를 지원하도록 업데이트되었습니다.

d()(date +$1%s.%N;)
b=`d`
for i in {1..8};{ (d -;sleep 8;d +)>>j&}
wait
bc<<<`d`-$b
bc<<<`<j`

이것은 j처음에 파일이 없다고 가정합니다 .


2
function s→ s(), b=`date +%s`→ b=$SECONDS, expr $t + $i→ $[t+i], `cat j`→ $(<j)일반적으로 Bash에서 골프 팁 을 줄이려면 다음을 참조하십시오 : pastebin.com/DDqUaDug
— manatwork

더 줄이려면 수식을 파일에 직접 쓰는 것이 좋습니다. j. 5↵5↵5↵…쓰지 말고 +5+5+5…산술 평가에 직접로드하고 두 번째 루프를 절약하십시오. pastebin.com/LB0BjDMZ
— manatwork

최소 정밀도가 나중에 지정 b=`date +%s`되었으므로 b=$SECONDS제안을 잊어 버리십시오 .
— manatwork

1
bash정수 산술 만 수행하는 것처럼 계산을 위해 외부 도구를 사용하려면 전체 솔루션을 다시 작성해야합니다. 일반적으로 bc: pastebin.com/eYFEVUuz
— manatwork

1
@JuliePelletier 좋아, 나는 그것을 내 자신의 답변으로 게시 할 것입니다. : 그래도, 당신이 여전히 상당히 접근 방식 변경하지 않고 대답에 골프 기술의 일부를 적용 할 수 있다고 생각 pastebin.com/ssYzVs1n (93 바이트)
— 디지털 외상을

8

자바 스크립트 (ES6), 148 바이트

with(performance)Promise.all([...Array(9)].map(_=>new Promise(r=>setTimeout(_=>r(t+=now()),7e3,t-=now())),t=0,n=now())).then(_=>alert([now()-n,t]));

총 63 초 (실제로 63.43 시도) 동안 7 초 동안 9 번 기다릴 것을 약속하지만 실제로 시도 할 때 실제로는 7.05 초만 걸립니다.


8

C, 127 바이트 (CPU 회전)

이 솔루션은 휴면 대신 CPU를 회전시키고 timesPOSIX 기능 (상위 프로세스 및 대기 한 모든 하위에서 소비 된 CPU 시간을 측정)을 사용하여 시간을 계산 합니다.

그것은 각각 9 초 동안 회전하는 7 개의 프로세스를 분기하고 C 클럭 (대부분의 시스템에서 100 클럭 틱 = 1 초)으로 최종 시간을 인쇄합니다.

t;v[4];main(){fork(fork(fork(t=time(0))));while(time(0)<=t+9);wait(0);wait(0);wait(0)>0&&(times(v),printf("%d,%d",v[0],v[2]));}

샘플 출력 :

906,6347

실시간 9.06 초, 총 CPU 시간 63.47 초를 의미합니다.

최상의 결과를 얻으려면 -std=c90 -m32(64 비트 시스템에서 강제 32 비트 코드)로 컴파일하십시오 .


5

PowerShell v4, 144 바이트

$d=date;gjb|rjb
1..20|%{sajb{$x=date;sleep 3;((date)-$x).Ticks/1e7}>$null}
while(gjb -s "Running"){}(gjb|rcjb)-join'+'|iex
((date)-$d).Ticks/1e7

세트 $d에 동일 Get-Date하고, 어떤 기존의 작업 기록을 삭제합니다 Get-Job | Remove-Job. 그런 다음 루프를 반복 1..20|%{...}하고 각 반복 이 작업에 대한 Start-Job스크립트 블록 {$x=date;sleep 3;((date)-$x).ticks/1e7}을 전달합니다 (각 작업이 해당 스크립트 블록을 실행 함을 의미 함). >$null반환되는 피드백 (즉, 작업 이름, 상태 등)을 억제하기 위해 출력을 파이프합니다 .

스크립트 블록 세트 $x로는 Get-Date다음 Start-Sleep을 위해 3초, 새로운 소요 Get-Date, 독서를 뺍 $x의를 가져 .Ticks, 그리고에 의해 분할 1e7(정밀) 초를 얻을 수 있습니다.

메인 스레드로 -S돌아가서 어떤 작업이 여전히 tatus "Running"인 한 빈 while루프 내부에서 회전 합니다. 이 작업이 완료되면 Get-Job기존의 모든 작업에 대한 객체를 Receive-Job가져 와서 STDOUT에 해당하는 항목 (즉, 출력되는 내용), -join결과와 함께 가져 +와서 파이프를 연결합니다 iex( Invoke-Expression와 유사 eval). 그러면 결과 절전 시간과 오버 헤드가 출력됩니다.

최종 라인은 새로운 날짜를 얻는다 원래 날짜 스탬프를 감산에 있다는 비슷 $d상기를 취득 .Ticks하고, 분할하여 1e7출력하는 총 실행 시간.


NB

좋아, 이것은 규칙 의 약간 구부러진 것 입니다. 처음 실행시 PowerShell은 기본 셸 프로필로로드되지 않으므로 다양한 스레드 작업을 위해 디스크에서 여러 .NET 어셈블리를로드해야합니다. 후속 실행은 어셈블리가 이미 메모리에 있으므로 제대로 작동합니다. 셸 창을 충분히 오래 유휴 상태로두면 PowerShell의 기본 제공 가비지 수집을 통해 해당 어셈블리를 모두 언로드 하여 다음 실행시 다시로드 할 때 시간이 오래 걸립니다. 이 문제를 해결할 방법이 확실하지 않습니다.

아래 실행에서 실행 시간에서 이것을 볼 수 있습니다. 새로운 쉘을 시작하고 골프 디렉토리로 이동하여 스크립트를 실행했습니다. 첫 번째 실행은 끔찍했지만 두 번째 실행 (즉각 실행)은 정상적으로 작동했습니다. 그런 다음 가비지 수집이 가능하도록 몇 분 동안 쉘을 유휴 상태로 두었다가 다시 실행 시간이 길어 지지만 후속 실행은 다시 정상적으로 작동합니다.

예제 실행

Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS H:\> c:

PS C:\> cd C:\Tools\Scripts\golfing

PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
63.232359
67.8403415

PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.0809705
8.8991164

PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
62.5791712
67.3228933

PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.1303589
8.5939405

PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.3210352
8.6386886

PS C:\Tools\Scripts\golfing>

1
괜찮습니다. :-)
— Adám

5

자바 스크립트 (ES6) 212 203 145 바이트

이 코드는로드 할 때 각각 정확히 6 초의 시간 간격으로 10 개의 이미지를 만듭니다.

실행 시간은 오버 헤드로 인해 조금 위로 올라갑니다 .

이 코드는 문서의 모든 것을 덮어 씁니다!

P=performance,M=P.now(T=Y=0),document.body.innerHTML='<img src=# onerror=setTimeout(`T+=P.now()-M,--i||alert([P.now()-M,T])`,6e3) >'.repeat(i=10)

이는 Javascript 엔진이 트립되지 않는 데 필요한 백틱에 단일 바이트 인코딩을 사용한다고 가정합니다.


또는 6 초 동안 기다리지 않으려면 1 초 이내에 완료되는 1 바이트 길이의 솔루션이 있습니다.

P=performance,M=P.now(T=Y=0),document.body.innerHTML='<img src=# onerror=setTimeout(`T+=P.now()-M,--i||alert([P.now()-M,T])`,600) >'.repeat(i=100)

차이점은이 코드는 100 개의 이미지에서 600ms 동안 대기한다는 것입니다. 이로 인해 엄청난 오버 헤드가 발생합니다.


이전 버전 (203 바이트) :

이 코드는 10 개의 이미지를 만드는 대신 정확히 6 초의 시간 간격으로 10 개의 iframe을 만듭니다.

for(P=performance,M=P.now(T=Y=i=0),D=document,X=_=>{T+=_,--i||alert([P.now()-M,T])};i<10;i++)I=D.createElement`iframe`,I.src='javascript:setTimeout(_=>top.X(performance.now()),6e3)',D.body.appendChild(I)


원본 버전 (212 바이트) :

P=performance,M=P.now(T=Y=0),D=document,X=_=>{T+=_,Y++>8&&alert([P.now()-M,T])},[...''+1e9].map(_=>{I=D.createElement`iframe`,I.src='javascript:setTimeout(_=>top.X(performance.now()),6e3)',D.body.appendChild(I)})


2
+1 아주 좋고 다른 접근법. 단일 스레드 브라우저에서 어떤 일이 발생합니까?
— Adám

2
@ Adám 행동에 변화가 없습니다. 여전히 약 6 초의 지연이 있습니다. Firefox (단일 스레드 브라우저)는 때때로 실행 시간 59999와 같은 재미있는 내용을 출력합니다.
— Ismael Miguel

4

루비, 92

n=->{Time.now}
t=n[]
a=0
(0..9).map{Thread.new{b=n[];sleep 6;a+=n[]-b}}.map &:join
p n[]-t,a

4

자바 스크립트 (ES6) 108 92 바이트

약간 다른 aproach를 사용하기 때문에 새로운 답변을 만들고 있습니다.

그것은 대량의 setTimeouts를 생성하며 , 거의 모두 4ms 사이에서 실행됩니다.

각 간격은 610 밀리 초이며 총 99 개의 간격에 걸쳐 있습니다.

M=(N=Date.now)(T=Y=0),eval('setTimeout("T+=N()-M,--i||alert([N()-M,T])",610);'.repeat(i=99))

일반적으로 약 60.5 초의 총 실행 시간 동안 610ms 이내에 실행됩니다.

이것은 Windows 8.1 x64에서 Chrome 버전 51.0.2704.84 m에서 테스트되었습니다.


이전 버전 (108 바이트) :

P=performance,M=P.now(T=Y=0),eval('setTimeout("T+=P.now()-M,--i||alert([P.now()-M,T])",610);'.repeat(i=99))


4

스크래치 -164 바이트 (16 블록)

when gf clicked
set[t v]to[
repeat(9
  create clone of[s v
end
wait until<(t)>[60
say(join(join(t)[ ])(timer
when I start as a clone
wait(8)secs
change[t v]by(timer

비주얼 스크립트

여기 에서 실제로 확인 하십시오 .

't'라는 변수와 's'라는 스프라이트를 사용합니다. 스프라이트는 각각 8 초 동안 대기하는 복제본을 생성하고 전체 대기 시간을 기록하는 변수를 증가시킵니다. 마지막에는 총 실행 시간과 총 대기 시간 (예 :)이 표시됩니다 65.488 8.302.


4

클로저, 135 120 111 109 바이트

(let[t #(System/nanoTime)s(t)f #(-(t)%)][(apply +(pmap #(let[s(t)](Thread/sleep 7e3)%(f s))(range 9)))(f s)])

명명 된 변수가있는 형식화 된 버전 :

(let [time #(System/currentTimeMillis)
      start (time)
      fmt #(- (time) %)]
  [(apply +
           (pmap #(let [thread-start (time)]
                   (Thread/sleep 7e3)
                   %
                   (fmt thread-start)) (range 9)))
   (fmt start)])

출력 (나노초) :

[62999772966 7001137032]

형식이 변경되었습니다. 감사합니다 Adám, 나는 그것을 읽을 때 질문에서 해당 형식 사양을 놓쳤을 수 있습니다.

골프 능력을 위해 nanoTime으로 변경했습니다.

고맙습니다 cliffroot, 나는 과학적 표기법을 잊어 버렸고 내가 보지 못했다고 믿을 수 없었습니다 apply. 어제 골프를 타면서 게시 한 적이없는 것으로 생각했습니다. 당신은 2 바이트를 저장했습니다.


PPCG에 오신 것을 환영합니다! 좋은 첫 포스트! 출력 형식에 대해 OP에 문의 할 수 있습니다.
— Rɪᴋᴇʀ

되돌릴 필요가 없습니다. OP : 어떤 방법 으로든 어떤 형식 으로든 .
— Adám

당신이 사용할 수있는 것 같아 7e3대신 7000하고 사용 apply대신에reduce
— cliffroot

3

녹, 257 , 247 바이트

나는 Mego의 Python 답변과 같은 시간을 사용합니다.

실제로 약간 영리한 비트는 ii를 사용하여 지속 시간을 0 초입니다.

fn main(){let n=std::time::Instant::now;let i=n();let h:Vec<_>=(0..8).map(|_|std::thread::spawn(move||{let i=n();std::thread::sleep_ms(9000);i.elapsed()})).collect();let mut t=i-i;for x in h{t+=x.join().unwrap();}print!("{:?}{:?}",t,i.elapsed());}

인쇄물:

Duration { secs: 71, nanos: 995877193 }Duration { secs: 9, nanos: 774491 }

언 골프 드 :

fn main(){
    let n = std::time::Instant::now;
    let i = n();
    let h :Vec<_> =
        (0..8).map(|_|
            std::thread::spawn(
                move||{
                    let i = n();
                    std::thread::sleep_ms(9000);
                    i.elapsed()
                }
            )
        ).collect();
    let mut t=i-i;
    for x in h{
        t+=x.join().unwrap();
    }
    print!("{:?}{:?}",t,i.elapsed());
}

편집 : 좋은 오래된 for 루프가 조금 짧습니다.


3

JavaScript (ES6, WebWorkers 사용) 233 215 바이트

c=s=0;d=new Date();for(i=14;i-->0;)(new Worker(URL.createObjectURL(new Blob(['a=new Date();setTimeout(()=>postMessage(new Date()-a),5e3)'])))).onmessage=m=>{s+=m.data;if(++c>13)console.log((new Date()-d)/1e3,s/1e3)}

UPD : 교차 출처 정책의 측면에서 작업자가 문자열에서 실행되는 방식을보다 간결하고 브라우저 간 검색 방식으로 대체했습니다. Safari webkitURL대신 객체 가 있고 Safari에서는 Safari에서 작동하지 않습니다 URL.


1
이것을 실행할 때 오류가 발생합니다.{ "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 }
— DJMcMayhem

3

파이썬 2, 130 바이트

import thread as H,time as T
m=T.clock;T.z=m()
def f(k):T.sleep(k);T.z+=m()
exec"H.start_new_thread(f,(7,));"*9
f(8);print m(),T.z

이것은 Mego의 답변에서 파생되었지만 별도의 답변이어야한다고 생각하는 것과는 완전히 다릅니다. Windows에서 작동하도록 테스트되었습니다.

기본적으로 9 개의 스레드를 제거하여 부모가 8 동안자는 동안 7 초 동안 잠을 자면 시간을 인쇄합니다. 샘플 출력 :

8.00059192923 71.0259046024

Windows에서는 time.clock첫 번째 통화 이후의 월 시간을 측정합니다.



3

펄 6, 72 71 바이트

이 작업을 수행하는 더 짧은 방법이있을 수 있습니다

say sum await map {start {sleep 7;now -ENTER now}},^9;say now -INIT now

이 출력

63.00660729694
7.0064013

2

수학, 109 바이트

a=AbsoluteTiming;LaunchKernels@7;Plus@@@a@ParallelTable[#&@@a@Pause@9,{7},Method->"EvaluationsPerKernel"->1]&

익명의 기능. 7 개 이상의 하위 커널이있는 라이센스가 필요합니다. 오버 헤드를 고려하지 않고 실시간으로 9 초 및 커널 시간 63 초가 소요됩니다. 위의 명령문을 한 번만 실행하십시오 (따라서 커널을 다시 시작하지 마십시오). 테스트 :

In[1]:= a=AbsoluteTiming;LaunchKernels@7;func=Plus@@@a@ParallelTable[#&@@a@Pause
@9,{7},Method->"EvaluationsPerKernel"->1]&;

In[2]:= func[]

Out[2]= {9.01498, 63.0068}

In[3]:= func[]

Out[3]= {9.01167, 63.0047}

In[4]:= func[]

Out[4]= {9.00587, 63.0051}

2
하위 프로세스를 포크하는 데 라이센스 제한을 두려면 Wolfram에 맡기십시오.
— 마리오 카네이로

2

자바 스크립트 (ES6), 105 바이트

((t,c,d)=>{i=t();while(c--)setTimeout((c,s)=>{d+=t()-s;if(!c)alert([t()-i,d])},8e3,c,t())})(Date.now,8,0)

업데이트 버전 : 106 bytes @Ismael Miguel에서 잠자기 시간을 줄이고 간격을 높이는 좋은 아이디어를 얻었으므로 빌려주었습니다.

((t,c,d)=>{i=t();while(c--)setTimeout((c,s)=>{d+=t()-s;if(!c)alert([t()-i,d])},610,c,t())})(Date.now,99,0)

자바 스크립트 Ungolfed, 167 바이트

(function(t, c, d){
	i = t();
	while(c--){
		setTimeout(function(c, s){
			d += t() - s;
			if (!c) alert([t() - i, d])
		}, 8e3, c, t())
	}
})(Date.now, 8, 0)


2
대신을 d+=t()-s;if(!c)alert([t()-i,d])쓰면 d+=t()-s;c||alert([t()-i,d])몇 바이트를 절약 할 수 있습니다 . 또한 함수를 제거하고 다시 작성하면 92 바이트 길이의 솔루션과 경쟁 할 수 있습니다 for(c=8,i=(t=Date.now)(d=0);c--;)setTimeout((c,s)=>{d+=t()-s;c||alert([t()-i,d])},8e3,c,t()). 그리고 네, 이것도 92 바이트입니다.
— Ismael Miguel

2

Java, 33444337316313 바이트

import static java.lang.System.*;class t extends Thread{public void run(){long s=nanoTime();try{sleep(999);}catch(Exception e){}t+=nanoTime()-s;}static long t,i,x;public static void main(String[]a)throws Exception{x=nanoTime();for(;++i<99;)new t().start();sleep(9000);out.println((nanoTime()-x)/1e9+" "+t/1e9);}}

그리고 ungolfed

import static java.lang.System.*;

class t extends Thread {
    public void run() {
        long s = nanoTime();
        try {
            sleep(999);
        } catch (Exception e) {
        }
        t += nanoTime() - s;
    }

    static long t,i,x;

    public static void main(String[] a) throws Exception {
        x = nanoTime();
        for (; ++i < 99;)
            new t().start();
        sleep(9000);
        out.println((nanoTime() - x) / 1e9 + " " + t / 1e9);
    }
}

이 솔루션은 스레드 안전이 아니므로 집에서 시도하지 마십시오.

편집하다:

@A Boschman과 @ Adám의 제안을 받았으며 이제 프로그램을 실행하는 데 10 초 미만이 소요되며 15 바이트가 더 짧습니다.


2
Thread 클래스의 자식 안에 있습니다. Thread.at static sleep () 메서드 호출 을 생략 할 수 없습니까? 또한,이 프로그램은 10 초 동안 약간 종료되어 실격되지 않습니까?
— Boschman 2016 년

@ABoschman 제안 해 주셔서 감사합니다. 지금까지 수정되어 더 이상 10 초 이상 실행되지 않습니다.
— user902383

1
또한, 우리는 자바에서 골프를위한 유용한 팁을 가지고 있다는 것을 잊지 마십시오 :)
— Katenkyo

1
이것은 읽기-수정-쓰기 경쟁 조건에 영향을 받기 쉽습니다. 주변에 어떤 종류의 잠금 장치도 없습니다 static long t. 스펙에 "두 시간 값 모두 최소 0.1 초의 정밀도를 가져야합니다."
— Poke

1
당신은 제거 할 수 있습니다 long 전과 s을 추가 ,s받는 static long t,i,s;몇 바이트를 저장합니다.
— Kevin Cruijssen

2

C (pthreads 포함), 339 336 335 바이트

#include<stdio.h>
#include<sys/time.h>
#include<pthread.h>
#define d double
d s=0;int i;pthread_t p[14];d t(){struct timeval a;gettimeofday(&a,NULL);return a.tv_sec+a.tv_usec/1e6;}
h(){d b=t();sleep(5);s+=t()-b;}
main(){d g=t();for(i=14;i-->0;)pthread_create(&p[i],0,&h,0);for(i=14;i-->0;)pthread_join(p[i],0);printf("%f %f",t()-g,s);}

2

C90 (OpenMP), 131 바이트 (env 변수의 경우 +17) = 148 바이트

#include <omp.h>
#define o omp_get_wtime()
n[4];main(t){t=o;
#pragma omp parallel
while(o-9<t);times(n);printf("%d,%f",n[0],o-t);}

출력 예 :

7091,9.000014

노트:

7091의주기 (100 / 초)이므로 프로그램이 70 초 동안 실행되었습니다.

omp_get_wtime () 이외의 타이머를 작동시키는 방법을 알아 내면 include 문을 제거 할 수 있기 때문에 훨씬 짧을 수 있습니다.

OMP_NUM_THREADS = 9로 실행


env var를 설정할 수 있지만 선택한 설정이 공통 기본값 인 경우를 제외하고는 바이트 수를 계산해야합니다.
— Adám

@ 아담 덕분에, 즉, 6 또는 7 바이트 저장, 내가 무슨 생각
— dj0wns

2

공통 리스프 (SBCL) 166 바이트 :

(do((m #1=(get-internal-real-time))(o(list 0)))((>(car o)60000)`(,(car o),(- #1#m)))(sb-thread:make-thread(lambda(&aux(s #1#))(sleep 1)(atomic-incf(car o)(- #1#s)))))

이것은 잠자는 스레드를 생성 한 다음 총 시간이 60000 틱 (즉, sbcl의 60 초)을 기다리는 회전하는 외부 루프와 함께 시간이 걸리는 원자 적으로 증가합니다. 카운터는 atomic-incf가 수정할 수있는 장소 유형의 제한으로 인해 목록에 저장됩니다. 더 빠른 시스템에서 종료하기 전에 공간이 부족할 수 있습니다.

언 골프 드 :

(do ((outer-start (get-internal-real-time))
       (total-inner (list 0)))
      ((> (car total-inner) 60000)
       `(,(car total-inner)
      ,(- (get-internal-real-time) outer-start)))
    (sb-thread:make-thread
     (lambda (&aux(start (get-internal-real-time)))
       (sleep 1)
       (atomic-incf (car total-inner) (- (get-internal-real-time) start)))))

2

펄, 101 바이트

use Time::HiRes<time sleep>;pipe*1=\time,0;
print time-$1,eval<1>if open-print{fork&fork&fork}-sleep 9

7 개의 하위 프로세스를 분기하고 각 프로세스는 9 초 동안 대기합니다.

샘플 출력 :

perl wait-one-minute.pl
9.00925707817078-63.001741

1

Groovy, 158143 자

d={new Date().getTime()}
s=d(j=0)
8.times{Thread.start{b=d(m=1000)
sleep 8*m
synchronized(j){j+=d()-b}}}addShutdownHook{print([(d()-s)/m,j/m])}

샘플 실행 :

bash-4.3$ groovy wait1minute.groovy
[8.031, 64.055]

1

엘릭서, 168 바이트

import Task;import Enum;IO.puts elem(:timer.tc(fn->IO.puts(map(map(1..16,fn _->async(fn->:timer.tc(fn->:timer.sleep(4000)end)end)end),&(elem(await(&1),0)))|>sum)end),0)

샘플 실행 :

$ elixir thing.exs
64012846
4007547

출력은 총 대기 시간과 프로그램 실행 시간 (마이크로 초)입니다.

프로그램은 14 Task초를 생성 하고 이들을 매핑하여 각각을 기다린 다음 경과 시간의 합계를 찾습니다. Erlang을 사용 timer하여 시간을 측정합니다.


커뮤니티에 오신 것을 환영합니다 !!
— 아웃 골퍼 에릭

1

하스켈, 278 271 262 246 바이트

import Control.Concurrent.Chan
import Data.Time
import GHC.Conc
t=getCurrentTime
b!a=b=<<flip diffUTCTime<$>t<*>(a>>t)
w=threadDelay$5^10
0#_=t
i#a=a>>(i-1)#a
main=print!do r<-newChan;9#(forkIO$writeChan r!w);getChanContents r>>=print.sum.take 9

!조치가 취한 시간 a(두 b번째 인수)을 측정하고 결과에 첫 번째 인수를 적용 합니다.

w 수면 기능입니다.

main자체 측정되고 결과가 인쇄됩니다 ( print!...).

#인 replicateM지정된 액션 N 회 반복 (및 반환 t골프 때문에).

측정 된 부분 내에서 9 개의 스레드 ( replicate 9 $ forkIO ...)가 5^10밀리 초 (9.765625 초) 동안 휴면 하고 결과 ( writeChan)를 주 스레드 ( newChan)가 생성 한 파이프에 게시합니다.이 결과 는 9 개의 결과를 합산하여 총계 ( getChanContents >>= print . sum . take 9)를 인쇄합니다 .

산출:

87.938546708s
9.772032144s

1
@ Adám 6 ^ 9> 10 ^ 7 (10 초).
— Koterpillar 2016 년

1

파이썬 2, 132 바이트

프로세스 풀을 사용하여 9 개의 프로세스를 생성하고 각 프로세스를 7 초 동안 잠자 게합니다.

import time as t,multiprocessing as m
def f(x):d=s();t.sleep(x);return s()-d
s=t.time
a=s()
print sum(m.Pool(9).map(f,[7]*9)),s()-a

총 누적 절전 시간을 먼저 인쇄 한 다음 실제 런타임을 인쇄합니다.

$ python test.py
63.0631158352 7.04391384125

1

루비 ( parallel젬 포함), 123116 바이트

require'parallel'
n=->{Time.now}
t=n[]
q=0
Parallel.each(1..10,:in_threads=>10){z=n[];sleep 6;q+=n[]-z}
puts n[]-t,q

편집 : histocrat의 Ruby 답변에서 "Time.now"참조를 추가했습니다.


1

Matlab, 75 바이트

tic;parpool(9);b=1:9;parfor q=b
a=tic;pause(7);b(q)=toc(a);end
[sum(b);toc]

빠른 설명 : parfor작업자 풀에 분산 된 병렬 for-loop를 만듭니다. 경과 시간 tic을 toc측정하십시오 (그리고 MATLAB에서 가장 잘 명명 된 함수 중 하나입니다). 마지막 줄 (총 절전 시간과 경과 시간이있는 배열)은 세미콜론으로 끝나지 않기 때문에 출력됩니다.

그러나 이로 인해 무려 9 개의 본격적인 MATLAB 프로세스가 생성됩니다. 그러면이 특정 프로그램이 컴퓨터에서 할당 된 10 초 내에 완료되지 않을 가능성이 있습니다. 그러나 SSD가있는 고급 시스템에 설치된 Parallel Computing 도구 상자를 제외하고 도구 상자가없는 MATLAB 설치를 사용하면 10 초 이내에 완료 될 수 있다고 생각합니다. 필요한 경우 더 적은 수면 프로세스를 갖도록 매개 변수를 조정할 수 있습니다.


에 대한 오류 b는 이미 작업 공간에 무언가가 있었기 때문일 수 있습니다. 2015b에서parfor q=b
— Suever

@Suever 오, MATLAB 폴더에 bm이라는 스크립트가 있습니다.
— Sanchises
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.