17be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes/* 27be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * Copyright (C) 2012 The Android Open Source Project 37be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * 47be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 57be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * you may not use this file except in compliance with the License. 67be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * You may obtain a copy of the License at 77be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * 87be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 97be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * 107be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * Unless required by applicable law or agreed to in writing, software 117be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 127be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * See the License for the specific language governing permissions and 147be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes * limitations under the License. 157be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes */ 167be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 177be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes#include "benchmark.h" 187be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 197be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes#include <string.h> 207be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 217be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes#define KB 1024 227be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes#define MB 1024*KB 237be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 247be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes#define AT_COMMON_SIZES \ 257be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes Arg(8)->Arg(64)->Arg(512)->Arg(1*KB)->Arg(8*KB)->Arg(16*KB)->Arg(32*KB)->Arg(64*KB) 267be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 277be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes// TODO: test unaligned operation too? (currently everything will be 8-byte aligned by malloc.) 287be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 299edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughesstatic void BM_string_memcmp(int iters, int nbytes) { 307be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 317be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes char* src = new char[nbytes]; char* dst = new char[nbytes]; 327be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes memset(src, 'x', nbytes); 337be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes memset(dst, 'x', nbytes); 347be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StartBenchmarkTiming(); 357be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 367be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes volatile int c __attribute__((unused)) = 0; 379edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughes for (int i = 0; i < iters; ++i) { 387be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes c += memcmp(dst, src, nbytes); 397be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes } 407be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 417be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 427be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes SetBenchmarkBytesProcessed(int64_t(iters) * int64_t(nbytes)); 437be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes delete[] src; 447be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes delete[] dst; 457be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes} 469edb3e004b487e08cbbb54f2af18b15241550513Elliott HughesBENCHMARK(BM_string_memcmp)->AT_COMMON_SIZES; 477be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 489edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughesstatic void BM_string_memcpy(int iters, int nbytes) { 497be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 507be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes char* src = new char[nbytes]; char* dst = new char[nbytes]; 517be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes memset(src, 'x', nbytes); 527be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StartBenchmarkTiming(); 537be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 549edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughes for (int i = 0; i < iters; ++i) { 557be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes memcpy(dst, src, nbytes); 567be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes } 577be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 587be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 597be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes SetBenchmarkBytesProcessed(int64_t(iters) * int64_t(nbytes)); 607be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes delete[] src; 617be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes delete[] dst; 627be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes} 639edb3e004b487e08cbbb54f2af18b15241550513Elliott HughesBENCHMARK(BM_string_memcpy)->AT_COMMON_SIZES; 647be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 659edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughesstatic void BM_string_memmove(int iters, int nbytes) { 66fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes StopBenchmarkTiming(); 67fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes char* buf = new char[nbytes + 64]; 68fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes memset(buf, 'x', nbytes + 64); 69fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes StartBenchmarkTiming(); 70fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes 719edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughes for (int i = 0; i < iters; ++i) { 72fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes memmove(buf, buf + 1, nbytes); // Worst-case overlap. 73fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes } 74fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes 75fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes StopBenchmarkTiming(); 76fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes SetBenchmarkBytesProcessed(int64_t(iters) * int64_t(nbytes)); 77fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes delete[] buf; 78fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes} 799edb3e004b487e08cbbb54f2af18b15241550513Elliott HughesBENCHMARK(BM_string_memmove)->AT_COMMON_SIZES; 80fbe44ec0436a8ce735f4dbe06c5109e3c0d4a8aeElliott Hughes 819edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughesstatic void BM_string_memset(int iters, int nbytes) { 827be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 837be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes char* dst = new char[nbytes]; 847be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StartBenchmarkTiming(); 857be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 869edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughes for (int i = 0; i < iters; ++i) { 877be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes memset(dst, 0, nbytes); 887be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes } 897be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 907be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 917be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes SetBenchmarkBytesProcessed(int64_t(iters) * int64_t(nbytes)); 927be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes delete[] dst; 937be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes} 949edb3e004b487e08cbbb54f2af18b15241550513Elliott HughesBENCHMARK(BM_string_memset)->AT_COMMON_SIZES; 957be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 969edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughesstatic void BM_string_strlen(int iters, int nbytes) { 977be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 987be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes char* s = new char[nbytes]; 997be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes memset(s, 'x', nbytes); 1007be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes s[nbytes - 1] = 0; 1017be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StartBenchmarkTiming(); 1027be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 1037be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes volatile int c __attribute__((unused)) = 0; 1049edb3e004b487e08cbbb54f2af18b15241550513Elliott Hughes for (int i = 0; i < iters; ++i) { 1057be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes c += strlen(s); 1067be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes } 1077be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes 1087be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes StopBenchmarkTiming(); 1097be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes SetBenchmarkBytesProcessed(int64_t(iters) * int64_t(nbytes)); 1107be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes delete[] s; 1117be369d4c60e9df2316fdb6c73181a40020abef2Elliott Hughes} 1129edb3e004b487e08cbbb54f2af18b15241550513Elliott HughesBENCHMARK(BM_string_strlen)->AT_COMMON_SIZES; 113