mirror of https://github.com/lukechilds/node.git
Ryan Dahl
15 years ago
2 changed files with 212 additions and 0 deletions
@ -0,0 +1,107 @@ |
|||||
|
/**
|
||||
|
* gcc -o iotest io.c |
||||
|
*/ |
||||
|
|
||||
|
#include <unistd.h> |
||||
|
#include <string.h> |
||||
|
#include <fcntl.h> |
||||
|
#include <time.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
|
||||
|
int tsize = 1000 * 1048576; |
||||
|
const char *path = "/tmp/wt.dat"; |
||||
|
|
||||
|
|
||||
|
char* bufit(size_t l) |
||||
|
{ |
||||
|
char *p = malloc(l); |
||||
|
memset(p, '!', l); |
||||
|
return p; |
||||
|
} |
||||
|
|
||||
|
void writetest(int size, size_t bsize) |
||||
|
{ |
||||
|
int i; |
||||
|
char *buf = bufit(bsize); |
||||
|
clock_t start, end; |
||||
|
double elapsed; |
||||
|
double mbps; |
||||
|
|
||||
|
int fd = open(path, O_CREAT|O_WRONLY, 0644); |
||||
|
if (fd < 0) { |
||||
|
perror("open failed"); |
||||
|
exit(254); |
||||
|
} |
||||
|
|
||||
|
start = clock(); |
||||
|
for (i = 0; i < size; i += bsize) { |
||||
|
int rv = write(fd, buf, bsize); |
||||
|
if (rv < 0) { |
||||
|
perror("write failed"); |
||||
|
exit(254); |
||||
|
} |
||||
|
} |
||||
|
#ifdef __linux__ |
||||
|
fdatasync(fd); |
||||
|
#else |
||||
|
fsync(fd); |
||||
|
#endif |
||||
|
close(fd); |
||||
|
end = clock(); |
||||
|
elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; |
||||
|
mbps = ((tsize/elapsed)) / 1048576; |
||||
|
fprintf(stderr, "Wrote %d bytes in %03fs using %d byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps); |
||||
|
|
||||
|
free(buf); |
||||
|
} |
||||
|
|
||||
|
void readtest(int size, size_t bsize) |
||||
|
{ |
||||
|
int i; |
||||
|
char *buf = bufit(bsize); |
||||
|
clock_t start, end; |
||||
|
double elapsed; |
||||
|
double mbps; |
||||
|
|
||||
|
int fd = open(path, O_RDONLY, 0644); |
||||
|
if (fd < 0) { |
||||
|
perror("open failed"); |
||||
|
exit(254); |
||||
|
} |
||||
|
|
||||
|
start = clock(); |
||||
|
for (i = 0; i < size; i += bsize) { |
||||
|
int rv = read(fd, buf, bsize); |
||||
|
if (rv < 0) { |
||||
|
perror("write failed"); |
||||
|
exit(254); |
||||
|
} |
||||
|
} |
||||
|
close(fd); |
||||
|
end = clock(); |
||||
|
elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; |
||||
|
mbps = ((tsize/elapsed)) / 1048576; |
||||
|
fprintf(stderr, "Read %d bytes in %03fs using %d byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps); |
||||
|
|
||||
|
free(buf); |
||||
|
} |
||||
|
|
||||
|
void cleanup() { |
||||
|
unlink(path); |
||||
|
} |
||||
|
|
||||
|
int main() |
||||
|
{ |
||||
|
int i; |
||||
|
int bsizes[] = {1024, 4096, 8192, 16384, 32768, 65536, 0}; |
||||
|
|
||||
|
for (i = 0; bsizes[i] != 0; i++) { |
||||
|
writetest(tsize, bsizes[i]); |
||||
|
} |
||||
|
for (i = 0; bsizes[i] != 0; i++) { |
||||
|
readtest(tsize, bsizes[i]); |
||||
|
} |
||||
|
atexit(cleanup); |
||||
|
return 0; |
||||
|
} |
@ -0,0 +1,105 @@ |
|||||
|
var fs = require('fs'); |
||||
|
var Buffer = require('buffer').Buffer; |
||||
|
|
||||
|
var path = "/tmp/wt.dat"; |
||||
|
var tsize = 1000 * 1048576; |
||||
|
var bsizes = [1024, 4096, 8192, 16384, 32768, 65536]; |
||||
|
|
||||
|
function bufit(size) { |
||||
|
var buf = new Buffer(size); |
||||
|
for (var i = 0; i <buf.length ; i += 1) { |
||||
|
buf[i] = 33; |
||||
|
} |
||||
|
return buf; |
||||
|
} |
||||
|
|
||||
|
function once(emitter, name, cb) { |
||||
|
function incb() { |
||||
|
cb.apply(undefined, arguments); |
||||
|
emitter.removeListener(name, incb); |
||||
|
} |
||||
|
emitter.addListener(name, incb); |
||||
|
} |
||||
|
|
||||
|
function writetest(size, bsize) { |
||||
|
var s = fs.createWriteStream(path, {'flags': 'w', 'mode': 0644}); |
||||
|
var remaining = size; |
||||
|
var buf = bufit(bsize); |
||||
|
|
||||
|
function dowrite() { |
||||
|
var rv = s.write(buf); |
||||
|
remaining -= buf.length; |
||||
|
if (remaining > 0) { |
||||
|
//if (remaining % 90000 == 0) console.error("remaining: %d", remaining);
|
||||
|
//process.nextTick(dowrite);
|
||||
|
} else { |
||||
|
s.emit('done') |
||||
|
s.end(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
s.on('drain', function () { |
||||
|
dowrite(); |
||||
|
}); |
||||
|
|
||||
|
dowrite(); |
||||
|
|
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
function readtest(size, bsize) { |
||||
|
var s = fs.createReadStream(path, {'flags': 'r', 'encoding': 'binary', 'mode': 0644, 'bufferSize': bsize}); |
||||
|
s.addListener("data", function (chunk) { |
||||
|
// got a chunk...
|
||||
|
|
||||
|
}); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
function wt(tsize, bsize, done) { |
||||
|
var start = Date.now(); |
||||
|
s = writetest(tsize, bsizes[0]); |
||||
|
s.addListener('close', function() { |
||||
|
var end = Date.now(); |
||||
|
var diff = end - start; |
||||
|
console.log('Wrote '+ tsize +' bytes in '+ diff/1000 +'s using '+ bsize +' byte buffers: '+ ((tsize/(diff/1000)) / 1048576) +' mB/s'); |
||||
|
done(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function rt(tsize, bsize, done) { |
||||
|
var start = Date.now(); |
||||
|
s = readtest(tsize, bsizes[0]); |
||||
|
s.addListener('close', function() { |
||||
|
var end = Date.now(); |
||||
|
var diff = end - start; |
||||
|
console.log('Read '+ tsize +' bytes in '+ diff/1000 +'s using '+ bsize +' byte buffers: '+ ((tsize/(diff/1000)) / 1048576) +' mB/s'); |
||||
|
done(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
var bs= 0; |
||||
|
|
||||
|
function nextwt() { |
||||
|
if (bsizes.length <= bs) { |
||||
|
bs = 0; |
||||
|
nextrt(); |
||||
|
return; |
||||
|
} |
||||
|
wt(tsize, bsizes[bs], nextwt); |
||||
|
bs += 1; |
||||
|
} |
||||
|
|
||||
|
function nextrt() { |
||||
|
if (bsizes.length <= bs) { |
||||
|
fs.unlink(path, function (err) { |
||||
|
if (err) throw err; |
||||
|
console.log('All done!'); |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
rt(tsize, bsizes[bs], nextrt); |
||||
|
bs += 1; |
||||
|
} |
||||
|
|
||||
|
nextwt(); |
Loading…
Reference in new issue