Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
60 changed files
with
3,500 additions
and
2,636 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,200 @@ | ||
'use strict'; | ||
import {URL} from 'url'; | ||
import https = require('https'); | ||
import axios from 'axios'; | ||
import Benchmark = require('benchmark'); | ||
import fetch from 'node-fetch'; | ||
import request = require('request'); | ||
import got from '../source'; | ||
import PromisableRequest from '../source/as-promise/core'; | ||
import Request, {kIsNormalizedAlready} from '../source/core'; | ||
|
||
const {normalizeArguments} = PromisableRequest; | ||
|
||
// Configuration | ||
const httpsAgent = new https.Agent({ | ||
keepAlive: true, | ||
rejectUnauthorized: false | ||
}); | ||
|
||
const url = new URL('https://127.0.0.1:8080'); | ||
const urlString = url.toString(); | ||
|
||
const gotOptions = { | ||
agent: { | ||
https: httpsAgent | ||
}, | ||
rejectUnauthorized: false, | ||
retry: 0 | ||
}; | ||
|
||
const normalizedGotOptions = normalizeArguments(url, gotOptions); | ||
normalizedGotOptions[kIsNormalizedAlready] = true; | ||
|
||
const requestOptions = { | ||
strictSSL: false, | ||
agent: httpsAgent | ||
}; | ||
|
||
const fetchOptions = { | ||
agent: httpsAgent | ||
}; | ||
|
||
const axiosOptions = { | ||
url: urlString, | ||
httpsAgent, | ||
rejectUnauthorized: false | ||
}; | ||
|
||
const axiosStreamOptions: typeof axiosOptions & {responseType: 'stream'} = { | ||
...axiosOptions, | ||
responseType: 'stream' | ||
}; | ||
|
||
const httpsOptions = { | ||
rejectUnauthorized: false, | ||
agent: httpsAgent | ||
}; | ||
|
||
const suite = new Benchmark.Suite(); | ||
|
||
// Benchmarking | ||
suite.add('got - promise', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
await got(url, gotOptions); | ||
deferred.resolve(); | ||
} | ||
}).add('got - stream', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
got.stream(url, gotOptions).resume().once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('got - promise core', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
const stream = new PromisableRequest(url, gotOptions); | ||
stream.resume().once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('got - stream core', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
const stream = new Request(url, gotOptions); | ||
stream.resume().once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('got - stream core - normalized options', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
const stream = new Request(undefined as any, normalizedGotOptions); | ||
stream.resume().once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('request - callback', { | ||
defer: true, | ||
fn: (deferred: {resolve(): void}) => { | ||
request(urlString, requestOptions, (error: Error) => { | ||
if (error) { | ||
throw error; | ||
} | ||
|
||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('request - stream', { | ||
defer: true, | ||
fn: (deferred: {resolve(): void}) => { | ||
const stream = request(urlString, requestOptions); | ||
stream.resume(); | ||
stream.once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('node-fetch - promise', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
const response = await fetch(url, fetchOptions); | ||
await response.text(); | ||
|
||
deferred.resolve(); | ||
} | ||
}).add('node-fetch - stream', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
const {body} = await fetch(url, fetchOptions); | ||
|
||
body.resume(); | ||
body.once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('axios - promise', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
await axios.request(axiosOptions); | ||
deferred.resolve(); | ||
} | ||
}).add('axios - stream', { | ||
defer: true, | ||
fn: async (deferred: {resolve(): void}) => { | ||
const {data} = await axios.request(axiosStreamOptions); | ||
data.resume(); | ||
data.once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
} | ||
}).add('https - stream', { | ||
defer: true, | ||
fn: (deferred: {resolve(): void}) => { | ||
https.request(urlString, httpsOptions, response => { | ||
response.resume(); | ||
response.once('end', () => { | ||
deferred.resolve(); | ||
}); | ||
}).end(); | ||
} | ||
}).on('cycle', (event: Benchmark.Event) => { | ||
console.log(String(event.target)); | ||
}).on('complete', function (this: any) { | ||
console.log(`Fastest is ${this.filter('fastest').map('name') as string}`); | ||
|
||
internalBenchmark(); | ||
}).run(); | ||
|
||
const internalBenchmark = (): void => { | ||
console.log(); | ||
|
||
const internalSuite = new Benchmark.Suite(); | ||
internalSuite.add('got - normalize options', { | ||
fn: () => { | ||
normalizeArguments(url, gotOptions); | ||
} | ||
}).on('cycle', (event: Benchmark.Event) => { | ||
console.log(String(event.target)); | ||
}); | ||
|
||
internalSuite.run(); | ||
}; | ||
|
||
// Results (i7-7700k, CPU governor: performance): | ||
// got - promise x 3,092 ops/sec 卤5.25% (73 runs sampled) | ||
// got - stream x 4,313 ops/sec 卤5.61% (72 runs sampled) | ||
// got - promise core x 6,756 ops/sec 卤5.32% (80 runs sampled) | ||
// got - stream core x 6,863 ops/sec 卤4.68% (76 runs sampled) | ||
// got - stream core - normalized options x 7,960 ops/sec 卤3.83% (81 runs sampled) | ||
// request - callback x 6,912 ops/sec 卤6.50% (76 runs sampled) | ||
// request - stream x 7,821 ops/sec 卤4.28% (80 runs sampled) | ||
// node-fetch - promise x 7,036 ops/sec 卤8.17% (78 runs sampled) | ||
// node-fetch - stream x 7,877 ops/sec 卤4.17% (80 runs sampled) | ||
// axios - promise x 6,613 ops/sec 卤3.22% (76 runs sampled) | ||
// axios - stream x 8,642 ops/sec 卤2.84% (79 runs sampled) | ||
// https - stream x 9,955 ops/sec 卤6.36% (76 runs sampled) | ||
// Fastest is https - stream | ||
|
||
// got - normalize options x 166,389 ops/sec 卤0.63% (91 runs sampled) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import {AddressInfo} from 'net'; | ||
import https = require('https'); | ||
// @ts-ignore No types | ||
import createCert = require('create-cert'); | ||
|
||
(async () => { | ||
const keys = await createCert({days: 365, commonName: 'localhost'}); | ||
|
||
const server = https.createServer(keys, (_request, response) => { | ||
response.end('ok'); | ||
}).listen(8080, () => { | ||
const {port} = server.address() as AddressInfo; | ||
|
||
console.log(`Listening at https://localhost:${port}`); | ||
}); | ||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.