Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2011-11-11 00:11:19 +0400
committerBen Noordhuis <info@bnoordhuis.nl>2011-11-11 00:13:37 +0400
commit78ca5558451e29a6245f7a75c9b454a6ce7012f3 (patch)
tree1c093d1d46af1106b5354eff64b10b9f197bce52 /benchmark
parent0757c73a20da712b06bccdee7a322fd21dd6c799 (diff)
bench: optimize io.c benchmark
Use static buffers. Most clock ticks were spent in malloc() and free() instead of read() and write(). Fix measurements. Really fast runs would result in bogus results like: Wrote 1048576000 bytes in -0.731630s using 8192 byte buffers: -1366.811093mB/s
Diffstat (limited to 'benchmark')
-rw-r--r--benchmark/io.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/benchmark/io.c b/benchmark/io.c
index db3f04c107e..53a5231f023 100644
--- a/benchmark/io.c
+++ b/benchmark/io.c
@@ -2,41 +2,47 @@
* gcc -o iotest io.c
*/
+#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/time.h>
#include <assert.h>
#include <stdlib.h>
+#include <stdint.h>
#include <stdio.h>
-int tsize = 1000 * 1048576;
-const char *path = "/tmp/wt.dat";
+static int c = 0;
+static int tsize = 1000 * 1048576;
+static const char path[] = "/tmp/wt.dat";
+static char buf[65536];
-int c = 0;
+static uint64_t now(void) {
+ struct timeval tv;
-char* bufit(size_t l)
-{
- char *p = malloc(l);
- memset(p, '!', l);
- return p;
+ if (gettimeofday(&tv, NULL))
+ abort();
+
+ return tv.tv_sec * 1000000ULL + tv.tv_usec;
}
-void writetest(int size, size_t bsize)
+static void writetest(int size, size_t bsize)
{
int i;
- char *buf = bufit(bsize);
- struct timeval start, end;
+ uint64_t start, end;
double elapsed;
double mbps;
+ assert(bsize <= sizeof buf);
+
int fd = open(path, O_CREAT|O_WRONLY, 0644);
if (fd < 0) {
perror("open failed");
exit(254);
}
- assert(0 == gettimeofday(&start, NULL));
+ start = now();
+
for (i = 0; i < size; i += bsize) {
int rv = write(fd, buf, bsize);
if (c++ % 2000 == 0) fprintf(stderr, ".");
@@ -45,35 +51,40 @@ void writetest(int size, size_t bsize)
exit(254);
}
}
-#ifdef __linux__
+ close(fd);
+
+#ifndef NSYNC
+# ifdef __linux__
fdatasync(fd);
-#else
+# else
fsync(fd);
-#endif
- close(fd);
- assert(0 == gettimeofday(&end, NULL));
- elapsed = (end.tv_sec - start.tv_sec) + ((double)(end.tv_usec - start.tv_usec))/100000.;
+# endif
+#endif /* SYNC */
+
+ end = now();
+ elapsed = (end - start) / 1e6;
mbps = ((tsize/elapsed)) / 1048576;
- fprintf(stderr, "\nWrote %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
- free(buf);
+ fprintf(stderr, "\nWrote %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
}
void readtest(int size, size_t bsize)
{
int i;
- char *buf = bufit(bsize);
- struct timeval start, end;
+ uint64_t start, end;
double elapsed;
double mbps;
+ assert(bsize <= sizeof buf);
+
int fd = open(path, O_RDONLY, 0644);
if (fd < 0) {
perror("open failed");
exit(254);
}
- assert(0 == gettimeofday(&start, NULL));
+ start = now();
+
for (i = 0; i < size; i += bsize) {
int rv = read(fd, buf, bsize);
if (rv < 0) {
@@ -82,12 +93,12 @@ void readtest(int size, size_t bsize)
}
}
close(fd);
- assert(0 == gettimeofday(&end, NULL));
- elapsed = (end.tv_sec - start.tv_sec) + ((double)(end.tv_usec - start.tv_usec))/100000.;
+
+ end = now();
+ elapsed = (end - start) / 1e6;
mbps = ((tsize/elapsed)) / 1048576;
- fprintf(stderr, "Read %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
- free(buf);
+ fprintf(stderr, "Read %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
}
void cleanup() {