1c117cbae6196cfcade083805d999779fe8244091reed@google.com/*
2c117cbae6196cfcade083805d999779fe8244091reed@google.com * Copyright 2013 Google Inc.
3c117cbae6196cfcade083805d999779fe8244091reed@google.com *
4c117cbae6196cfcade083805d999779fe8244091reed@google.com * Use of this source code is governed by a BSD-style license that can be
5c117cbae6196cfcade083805d999779fe8244091reed@google.com * found in the LICENSE file.
6c117cbae6196cfcade083805d999779fe8244091reed@google.com */
7c117cbae6196cfcade083805d999779fe8244091reed@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
99ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein#include "SkTemplates.h"
10f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkUtils.h"
11c117cbae6196cfcade083805d999779fe8244091reed@google.com
129ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleintemplate <typename T, bool kInline>
13f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MemsetBench : public Benchmark {
14c117cbae6196cfcade083805d999779fe8244091reed@google.compublic:
159ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    explicit MemsetBench(int n)
169ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        : fN(n)
179ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        , fBuffer(n)
189ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        , fName(SkStringPrintf("memset%d_%d%s", sizeof(T)*8, n, kInline ? "_inline" : "")) {}
19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
209ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
219ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    const char* onGetName() override { return fName.c_str(); }
22c117cbae6196cfcade083805d999779fe8244091reed@google.com
239ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    void onDraw(const int loops, SkCanvas*) override;
24c117cbae6196cfcade083805d999779fe8244091reed@google.com
25c117cbae6196cfcade083805d999779fe8244091reed@google.comprivate:
269ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    int fN;
279ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    SkAutoTMalloc<T> fBuffer;
289ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    SkString fName;
29c117cbae6196cfcade083805d999779fe8244091reed@google.com};
30c117cbae6196cfcade083805d999779fe8244091reed@google.com
319ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleintemplate <> void MemsetBench<uint32_t, false>::onDraw(const int loops, SkCanvas*) {
329ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    for (int i = 0; i < 1000*loops; i++) {
339ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        sk_memset32(fBuffer.get(), 0xFACEB004, fN);
349ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    }
359ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein}
36c117cbae6196cfcade083805d999779fe8244091reed@google.com
379ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleintemplate <> void MemsetBench<uint16_t, false>::onDraw(const int loops, SkCanvas*) {
389ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    for (int i = 0; i < 1000*loops; i++) {
399ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        sk_memset16(fBuffer.get(), 0x4973, fN);
40c117cbae6196cfcade083805d999779fe8244091reed@google.com    }
419ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein}
42c117cbae6196cfcade083805d999779fe8244091reed@google.com
439ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleintemplate <typename T>
449ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinstatic void memsetT(T* dst, T val, int n) {
459ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    for (int i = 0; i < n; i++) { dst[i] = val; }
469ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein}
47c117cbae6196cfcade083805d999779fe8244091reed@google.com
489ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleintemplate <> void MemsetBench<uint32_t, true>::onDraw(const int loops, SkCanvas*) {
499ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    for (int i = 0; i < 1000*loops; i++) {
509ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        memsetT<uint32_t>(fBuffer.get(), 0xFACEB004, fN);
51c117cbae6196cfcade083805d999779fe8244091reed@google.com    }
529ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein}
53c117cbae6196cfcade083805d999779fe8244091reed@google.com
549ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleintemplate <> void MemsetBench<uint16_t, true>::onDraw(const int loops, SkCanvas*) {
559ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    for (int i = 0; i < 1000*loops; i++) {
569ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein        memsetT<uint16_t>(fBuffer.get(), 0x4973, fN);
579ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein    }
589ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein}
599ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein
609ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t,  true>(1)));
619ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t, false>(1)));
629ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t,  true>(10)));
639ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t, false>(10)));
649ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t,  true>(100)));
659ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t, false>(100)));
669ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t,  true>(1000)));
679ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t, false>(1000)));
689ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t,  true>(10000)));
699ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t, false>(10000)));
709ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t,  true>(100000)));
719ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint32_t, false>(100000)));
729ff378b01be0b0a3fc35677a2155ba4ade286cc2mtklein
739ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t,  true>(1)));
749ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t, false>(1)));
759ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t,  true>(10)));
769ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t, false>(10)));
779ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t,  true>(100)));
789ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t, false>(100)));
799ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t,  true>(1000)));
809ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t, false>(1000)));
819ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t,  true>(10000)));
829ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t, false>(10000)));
839ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t,  true>(100000)));
849ff378b01be0b0a3fc35677a2155ba4ade286cc2mtkleinDEF_BENCH(return (new MemsetBench<uint16_t, false>(100000)));
85