20
常常常常常常常常常常常常常常 Sleep sort サササササ ササ Shibuya.pm ササ ササ @TAKESAKO

Node.js - sleep sort algorithm

Embed Size (px)

DESCRIPTION

setTimeout

Citation preview

Page 1: Node.js - sleep sort algorithm

常識を覆すソートアルゴリズムSleep sort

常識を覆すソートアルゴリズムSleep sort

サイボウズ・ラボ / Shibuya.pm

竹迫 良範 @TAKESAKO

Page 2: Node.js - sleep sort algorithm

Cybozu University 22009/04/06

Page 3: Node.js - sleep sort algorithm

常識を覆すソートアルゴリズム Sleep sort常識を覆すソートアルゴリズム Sleep sort

実行方法

#!/bin/bashfunction f() { sleep "$1" && echo "$1"}while [ -n "$1" ]do f "$1" & shiftdonewait

$ ./sleepsort.bash 5 4 3 2 1

Page 4: Node.js - sleep sort algorithm

Cybozu University 42009/04/06

4ch BBS

Page 5: Node.js - sleep sort algorithm

Cybozu University 52009/04/06

Page 6: Node.js - sleep sort algorithm

Cybozu University 62009/04/06

Page 7: Node.js - sleep sort algorithm

Cybozu University 72009/04/06

Page 8: Node.js - sleep sort algorithm

Cybozu University 82009/04/06

Page 9: Node.js - sleep sort algorithm

Cybozu University 92009/04/06

package main

import ( "os" "strconv" "syscall")

func main() { args := os.Args[1:]

done := make(chan int64) for _, arg := range args { i, _ := strconv.Atoi64(arg) go func(i int64) { syscall.Sleep(i * 1e9) done <- i }(i) } for _ = range args { println(<-done) }}

Page 10: Node.js - sleep sort algorithm

Cybozu University 102009/04/06

setTimeout でSleep sort を実装してみた

Page 11: Node.js - sleep sort algorithm

JavaScript 版 Sleep sort ( 1000 ミリ秒単位)JavaScript 版 Sleep sort ( 1000 ミリ秒単位)

実行方法

function sleep_sort(a) { for(var i = 0; i < a.length; i++){ callback( a[i] ); } function callback(n) { setTimeout( function(){ document.body.innerHTML += n + "<br>\n"; }, n * 1000) }}

sleep_sort([5,4,3,2,1,0]);

Page 12: Node.js - sleep sort algorithm

ブラウザで実際に動かしてみるブラウザで実際に動かしてみる

setTimeout(f, n * 1000) バージョン

Page 13: Node.js - sleep sort algorithm

高速 JavaScript 版 Sleep sort ( 1 ミリ秒単位)高速 JavaScript 版 Sleep sort ( 1 ミリ秒単位)

実行方法

function sleep_sort(a) { for(var i = 0; i < a.length; i++){ callback( a[i] ); } function callback(n) { setTimeout( function(){ document.body.innerHTML += n + "<br>\n"; }, n * 1) }}

sleep_sort([11,12,5,4,3,13,2,1,0,9,8,7,6,10]);

Page 14: Node.js - sleep sort algorithm

本当に動くのかブラウザで実際に動かしてみる本当に動くのかブラウザで実際に動かしてみる

setTimeout(f, n * 1) ミリ秒バージョン

Page 15: Node.js - sleep sort algorithm

手元の環境で setTimeout の分解能を調べてみた手元の環境で setTimeout の分解能を調べてみた

setTimeout 分解能 単位 OS

IE n 0,1,2,3… ミリ秒

Windows7

Firefox (n+5)*2 10,12,14… ミリ秒

Windows7

Opera (n+1)*2 2,4,6,8… ミリ秒

Windows7

Chrome (n+1)*2 2,4,6,8… ミリ秒

Windows7

※ タブの表・裏や OS など環境によって差があります

Page 16: Node.js - sleep sort algorithm

※ クロスブラウザ対応とはこういうこと?※ クロスブラウザ対応とはこういうこと?

setTimeout(f, (n+5) * 2) ミリ秒バージョン

Page 17: Node.js - sleep sort algorithm

Cybozu University 172009/04/06

Node.js

Page 18: Node.js - sleep sort algorithm

Node.js 版 Sleep sort ( 10 ピコ秒単位)Node.js 版 Sleep sort ( 10 ピコ秒単位)

実行方法

function sleep_sort(a) { for(var i = 0; i < a.length; i++) { callback( a[i] ); } function callback(n) { setTimeout( function(){ console.log(n); } , (n+1) * 1e-8) }}sleep_sort(process.argv.slice(2));

$ node sort.js 5 4 3 2 1 0

Page 19: Node.js - sleep sort algorithm

Node.js の setTimeout 分解能(およそ)Node.js の setTimeout 分解能(およそ)

setTimeout 分解能 単位 OS

IE n 0,1,2,3… ミリ秒

Windows7

Firefox (n+5)*2 10,12,14… ミリ秒

Windows7

Chrome (n+1)*2 2,4,6,8… ミリ秒

Windows7

Node.js (n+1)*1e-8 10,20,30… ピコ秒

CentOS 5.6

SpiderMonkey

N/A ReferenceError:setTimeout is not defined

※ タブの表・裏や OS など環境によって差があります

Page 20: Node.js - sleep sort algorithm

Cybozu University 202009/04/06

Node.js最速伝説