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