1. 程式人生 > >深度理解nodejs[3]—瘋狂事件程式碼

深度理解nodejs[3]—瘋狂事件程式碼

瘋狂的程式碼。

下面這段瘋狂的程式碼,你能知道它輸出什麼結果嗎?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const https = require('https');
const start = Date.now();
const fs = require('fs');
const crypto = require('crypto');
function dorequest(){
 https.request('https://www.baidu.com',res=>{
   res.on('data'
,()=>{});

   res.on('end',()=>{
     console.log(Date.now()-start);
   });
 })
 .end();
}


function dohash(){
 crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
   console.log('hash:',Date.now()-start);
 });
}

dorequest();

fs.readFile('test.js'
,'utf8',()=>{

 console.log('FS:',Date.now()-start);
});
dohash();
dohash();
dohash();
dohash();

測試速度:

1
2
3
4
5
6
42
hash: 785
FS: 785
hash: 788
hash: 790
hash: 790

解釋:

  • https不依靠libuv庫的4個預設執行緒,作業系統資源。其第一個最快的執行完畢

  • FS和pbkdf2都使用了libuv中的執行緒池

  • 一開始FS與三個pbkdf2搶佔了libuv執行緒池的4個執行緒,但是由於FS讀取檔案,中斷操作。libuv將執行緒切換到執行最後一個pbkdf2函式。

  • 等到某一個pbkdf2函式執行完畢後,則繼續執行FS函式,所以看到了上面的結果。

image.png