You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					125 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					125 lines
				
				3.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# fastparallel [](https://github.com/mcollina/fastparallel/actions/workflows/ci.yml)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Zero-overhead parallel function call for node.js. Also supports each
							 | 
						||
| 
								 | 
							
								and map!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Benchmark for doing 3 calls `setImmediate` 1 million times:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								benchSetImmediate*1000000: 1378.514ms
							 | 
						||
| 
								 | 
							
								benchAsyncParallel*1000000: 1740.304ms
							 | 
						||
| 
								 | 
							
								benchAsyncEach*1000000: 1566.517ms
							 | 
						||
| 
								 | 
							
								benchAsyncMap*1000000: 1687.518ms
							 | 
						||
| 
								 | 
							
								benchNeoParallel*1000000: 1388.223ms
							 | 
						||
| 
								 | 
							
								benchNeoEach*1000000: 1473.006ms
							 | 
						||
| 
								 | 
							
								benchNeoMap*1000000: 1402.986ms
							 | 
						||
| 
								 | 
							
								benchInsyncParallel*1000000: 1957.863ms
							 | 
						||
| 
								 | 
							
								benchInsyncEach*1000000: 1383.822ms
							 | 
						||
| 
								 | 
							
								benchInsyncMap*1000000: 1822.954ms
							 | 
						||
| 
								 | 
							
								benchItemsParallel*1000000: 1690.118ms
							 | 
						||
| 
								 | 
							
								benchParallelize*1000000: 1570.064ms
							 | 
						||
| 
								 | 
							
								benchFastParallel*1000000: 1536.692ms
							 | 
						||
| 
								 | 
							
								benchFastParallelNoResults*1000000: 1363.145ms
							 | 
						||
| 
								 | 
							
								benchFastParallelEachResults*1000000: 1508.134ms
							 | 
						||
| 
								 | 
							
								benchFastParallelEach*1000000: 1325.314ms
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Obtained on node 12.18.2, on a dedicated server.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you need zero-overhead series function call, check out
							 | 
						||
| 
								 | 
							
								[fastseries](http://npm.im/fastseries). If you need a fast work queue
							 | 
						||
| 
								 | 
							
								check out [fastq](http://npm.im/fastq). If you need to run fast
							 | 
						||
| 
								 | 
							
								waterfall calls, use [fastfall](http://npm.im/fastfall).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://github.com/feross/standard)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								__The major difference between version 1.x.x and 2.x.x is the order of
							 | 
						||
| 
								 | 
							
								results__, this is now ready to replace async in every case.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Example for parallel call
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var parallel = require('fastparallel')({
							 | 
						||
| 
								 | 
							
								  // this is a function that will be called
							 | 
						||
| 
								 | 
							
								  // when a parallel completes
							 | 
						||
| 
								 | 
							
								  released: completed,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // if you want the results, then here you are
							 | 
						||
| 
								 | 
							
								  results: true
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parallel(
							 | 
						||
| 
								 | 
							
								  {}, // what will be this in the functions
							 | 
						||
| 
								 | 
							
								  [something, something, something], // functions to call
							 | 
						||
| 
								 | 
							
								  42, // the first argument of the functions
							 | 
						||
| 
								 | 
							
								  done // the function to be called when the parallel ends
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function something (arg, cb) {
							 | 
						||
| 
								 | 
							
								  setImmediate(cb, null, 'myresult')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function done (err, results) {
							 | 
						||
| 
								 | 
							
								  console.log('parallel completed, results:', results)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function completed () {
							 | 
						||
| 
								 | 
							
								  console.log('parallel completed!')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Example for each and map calls
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var parallel = require('fastparallel')({
							 | 
						||
| 
								 | 
							
								  // this is a function that will be called
							 | 
						||
| 
								 | 
							
								  // when a parallel completes
							 | 
						||
| 
								 | 
							
								  released: completed,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // if you want the results, then here you are
							 | 
						||
| 
								 | 
							
								  // passing false disables map
							 | 
						||
| 
								 | 
							
								  results: true
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parallel(
							 | 
						||
| 
								 | 
							
								  {}, // what will be this in the functions
							 | 
						||
| 
								 | 
							
								  something, // functions to call
							 | 
						||
| 
								 | 
							
								  [1, 2, 3], // the first argument of the functions
							 | 
						||
| 
								 | 
							
								  done // the function to be called when the parallel ends
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function something (arg, cb) {
							 | 
						||
| 
								 | 
							
								  setImmediate(cb, null, 'myresult')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function done (err, results) {
							 | 
						||
| 
								 | 
							
								  console.log('parallel completed, results:', results)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function completed () {
							 | 
						||
| 
								 | 
							
								  console.log('parallel completed!')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Caveats
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `done` function will be called only once, even if more than one error happen.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This library works by caching the latest used function, so that running a new parallel
							 | 
						||
| 
								 | 
							
								does not cause **any memory allocations**.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Why it is so fast?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. This library is caching functions a lot.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								2. V8 optimizations: thanks to caching, the functions can be optimized by V8 (if they are optimizable, and I took great care of making them so).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								3. Don't use arrays if you just need a queue. A linked list implemented via processes is much faster if you don't need to access elements in between.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								4. Accept passing a this for the functions. Thanks to this hack, you can extract your functions, and place them in a outer level where they are not created at every execution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ISC
							 |