/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Benchmark.h" #include "SkRandom.h" #include "SkTemplates.h" #include "SkUtils.h" template class Memcpy32Bench : public Benchmark { public: explicit Memcpy32Bench(int count, Memcpy32 memcpy32, const char* name) : fCount(count) , fMemcpy32(memcpy32) , fName(SkStringPrintf("%s_%d", name, count)) {} virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); } virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { return backend == kNonRendering_Backend; } virtual void onPreDraw() SK_OVERRIDE { fDst.reset(fCount); fSrc.reset(fCount); SkRandom rand; for (int i = 0; i < fCount; i++) { fSrc[i] = rand.nextU(); } } virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { for (int i = 0; i < loops; i++) { fMemcpy32(fDst, fSrc, fCount); } } private: SkAutoTMalloc fDst, fSrc; int fCount; Memcpy32 fMemcpy32; const SkString fName; }; template static Memcpy32Bench* Bench(int count, Memcpy32 memcpy32, const char* name) { return new Memcpy32Bench(count, memcpy32, name); } #define BENCH(memcpy32, count) DEF_BENCH(return Bench(count, memcpy32, #memcpy32); ) // Let the libc developers do what they think is best. static void memcpy32_memcpy(uint32_t* dst, const uint32_t* src, int count) { memcpy(dst, src, sizeof(uint32_t) * count); } BENCH(memcpy32_memcpy, 10) BENCH(memcpy32_memcpy, 100) BENCH(memcpy32_memcpy, 1000) BENCH(memcpy32_memcpy, 10000) BENCH(memcpy32_memcpy, 100000) // Test our chosen best, from SkUtils.h BENCH(sk_memcpy32, 10) BENCH(sk_memcpy32, 100) BENCH(sk_memcpy32, 1000) BENCH(sk_memcpy32, 10000) BENCH(sk_memcpy32, 100000) #undef BENCH