summaryrefslogtreecommitdiff
path: root/test/benchmarks/ins-sort.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/benchmarks/ins-sort.c')
-rw-r--r--test/benchmarks/ins-sort.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/benchmarks/ins-sort.c b/test/benchmarks/ins-sort.c
new file mode 100644
index 0000000..939be81
--- /dev/null
+++ b/test/benchmarks/ins-sort.c
@@ -0,0 +1,71 @@
+void *malloc(unsigned long);
+int printf(char *, ...);
+long atol(char *);
+void exit(int);
+int open(char *, int, int);
+long read(int, void *, unsigned long);
+
+void insertion_sort(int *a, long n)
+{
+ long i, j;
+ for (i = 1; i < n; ++i) {
+ for (j = i; j > 0; --j) {
+ if (a[j] < a[j-1]) {
+ int tmp = a[j];
+ a[j] = a[j-1];
+ a[j-1] = tmp;
+ } else {
+ break;
+ }
+ }
+ }
+}
+
+void *read_arr(int fd, int *len)
+{
+ int size = 1024 * 1024 * 20;
+ int i;
+ char *arr = malloc(size);
+
+ for (i = 0; ; ) {
+ int rd = read(fd, arr + i, size - i);
+ if (rd == -1)
+ exit(2);
+ if (rd == 0)
+ break;
+ i += rd;
+ }
+ printf("input is collected\n");
+ *len = i;
+ return arr;
+}
+
+int main(int argc, char **argv)
+{
+ int i, len;
+ unsigned int sum = 0;
+ int *arr;
+ int fd;
+
+ if (argc != 2) {
+ printf("%d\n", argc);
+ return 1;
+ }
+
+ len = atol(argv[1]);
+ fd = open(argv[1], 0, 0);
+ if (fd == -1)
+ return 1;
+ arr = read_arr(fd, &len);
+
+ len /= 4;
+
+ if (len != 64000)
+ return 10;
+
+ insertion_sort(arr, len);
+ for (i = 0; i < len; ++i)
+ sum = 2 * sum + arr[i];
+ printf("%u\n", sum);
+ return 0;
+}