133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner/* 233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * Copyright (C) 2011 The Android Open Source Project 333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * All rights reserved. 433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * 533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * Redistribution and use in source and binary forms, with or without 633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * modification, are permitted provided that the following conditions 733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * are met: 833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * * Redistributions of source code must retain the above copyright 933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * notice, this list of conditions and the following disclaimer. 1033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * * Redistributions in binary form must reproduce the above copyright 1133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * notice, this list of conditions and the following disclaimer in 1233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * the documentation and/or other materials provided with the 1333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * distribution. 1433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * 1533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 1833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 1933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 2133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 2233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 2333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 2433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 2533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * SUCH DAMAGE. 2733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner */ 2833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 2933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner/* This program tries to benchmark stdio operations like fread() and 3033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * fwrite() with various chunk sizes. We always read/write from /dev/zero 3133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * to ensure that disk speed and caching don't change our results. 3233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * 3333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * We really do this to measure improvements in the low-level stdio 3433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner * features. 3533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner */ 3633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 3733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner#include <stdio.h> 3833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner#include <time.h> 3933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner#include <string.h> 4033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner#include <errno.h> 4133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 4233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turnerstatic char buffer[1024*1024]; 4333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 4433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner/* Return current time in milli-seconds, as a double */ 4533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turnerstatic double 4633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turnernow_ms(void) 4733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner{ 4833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner struct timespec ts; 4933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner clock_gettime(CLOCK_MONOTONIC, &ts); 5033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner return ts.tv_sec*1000. + ts.tv_nsec*1e-6; 5133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner} 5233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 5333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turnervoid read_file(FILE* fp, int chunkSize) 5433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner{ 5533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner int totalSize = sizeof(buffer); 5633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner for ( ; totalSize > 0; totalSize -= chunkSize) { 5733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner fread(buffer, 1, chunkSize, fp); 5833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner } 5933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner} 6033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 6133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turnervoid write_file(FILE* fp, int chunkSize) 6233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner{ 6333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner int totalSize = sizeof(buffer); 6433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner for ( ; totalSize > 0; totalSize -= chunkSize) { 6533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner fwrite(buffer, 1, chunkSize, fp); 6633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner } 6733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner} 6833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 6933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner#define BENCH(op,...) \ 7033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner do { \ 7133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner double time_ms = now_ms(); \ 7233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner op ; \ 7333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner time_ms = now_ms() - time_ms; \ 7433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner double bandwidth = sizeof(buffer)*1000./1024./time_ms; \ 7533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner printf("bench %-30s %8.2f ms (%.1f KB/s) \n", #op, time_ms, bandwidth ); \ 7633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner } while (0) 7733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 7833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turnerint main(void) 7933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner{ 8033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner FILE* fp = fopen("/dev/zero", "rw"); 8133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 8233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner if (fp == NULL) { 8333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner fprintf(stderr,"Could not open /dev/zero: %s\n", strerror(errno)); 8433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner return 1; 8533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner } 8633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 8733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,1)); 8833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,2)); 8933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,3)); 9033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,4)); 9133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,8)); 9233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,16)); 9333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,32)); 9433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,64)); 9533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,256)); 9633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,1024)); 9733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,4096)); 9833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,16384)); 9933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(read_file(fp,65536)); 10033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 10133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,1)); 10233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,2)); 10333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,3)); 10433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,4)); 10533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,8)); 10633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,16)); 10733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,32)); 10833cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,64)); 10933cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,256)); 11033cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,1024)); 11133cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,4096)); 11233cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,16384)); 11333cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner BENCH(write_file(fp,65536)); 11433cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner 11533cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner fclose(fp); 11633cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner return 0; 11733cf0fee9523f7c796a71f42d2031a532351bb88David 'Digit' Turner} 118