MemsetBench.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright 2013 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "bench/Benchmark.h"
  8. #include "include/private/SkTemplates.h"
  9. #include "src/core/SkUtils.h"
  10. template <typename T, bool kInline>
  11. class MemsetBench : public Benchmark {
  12. public:
  13. explicit MemsetBench(int n)
  14. : fN(n)
  15. , fBuffer(n)
  16. , fName(SkStringPrintf("memset%d_%d%s", sizeof(T)*8, n, kInline ? "_inline" : "")) {}
  17. bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
  18. const char* onGetName() override { return fName.c_str(); }
  19. void onDraw(int loops, SkCanvas*) override;
  20. private:
  21. int fN;
  22. SkAutoTMalloc<T> fBuffer;
  23. SkString fName;
  24. };
  25. template <> void MemsetBench<uint32_t, false>::onDraw(int loops, SkCanvas*) {
  26. for (int i = 0; i < 1000*loops; i++) {
  27. sk_memset32(fBuffer.get(), 0xFACEB004, fN);
  28. }
  29. }
  30. template <> void MemsetBench<uint16_t, false>::onDraw(int loops, SkCanvas*) {
  31. for (int i = 0; i < 1000*loops; i++) {
  32. sk_memset16(fBuffer.get(), 0x4973, fN);
  33. }
  34. }
  35. template <typename T>
  36. static void memsetT(T* dst, T val, int n) {
  37. for (int i = 0; i < n; i++) { dst[i] = val; }
  38. }
  39. template <> void MemsetBench<uint32_t, true>::onDraw(int loops, SkCanvas*) {
  40. for (int i = 0; i < 1000*loops; i++) {
  41. memsetT<uint32_t>(fBuffer.get(), 0xFACEB004, fN);
  42. }
  43. }
  44. template <> void MemsetBench<uint16_t, true>::onDraw(int loops, SkCanvas*) {
  45. for (int i = 0; i < 1000*loops; i++) {
  46. memsetT<uint16_t>(fBuffer.get(), 0x4973, fN);
  47. }
  48. }
  49. DEF_BENCH(return (new MemsetBench<uint32_t, true>(1)));
  50. DEF_BENCH(return (new MemsetBench<uint32_t, false>(1)));
  51. DEF_BENCH(return (new MemsetBench<uint32_t, true>(10)));
  52. DEF_BENCH(return (new MemsetBench<uint32_t, false>(10)));
  53. DEF_BENCH(return (new MemsetBench<uint32_t, true>(100)));
  54. DEF_BENCH(return (new MemsetBench<uint32_t, false>(100)));
  55. DEF_BENCH(return (new MemsetBench<uint32_t, true>(1000)));
  56. DEF_BENCH(return (new MemsetBench<uint32_t, false>(1000)));
  57. DEF_BENCH(return (new MemsetBench<uint32_t, true>(10000)));
  58. DEF_BENCH(return (new MemsetBench<uint32_t, false>(10000)));
  59. DEF_BENCH(return (new MemsetBench<uint32_t, true>(100000)));
  60. DEF_BENCH(return (new MemsetBench<uint32_t, false>(100000)));
  61. DEF_BENCH(return (new MemsetBench<uint16_t, true>(1)));
  62. DEF_BENCH(return (new MemsetBench<uint16_t, false>(1)));
  63. DEF_BENCH(return (new MemsetBench<uint16_t, true>(10)));
  64. DEF_BENCH(return (new MemsetBench<uint16_t, false>(10)));
  65. DEF_BENCH(return (new MemsetBench<uint16_t, true>(100)));
  66. DEF_BENCH(return (new MemsetBench<uint16_t, false>(100)));
  67. DEF_BENCH(return (new MemsetBench<uint16_t, true>(1000)));
  68. DEF_BENCH(return (new MemsetBench<uint16_t, false>(1000)));
  69. DEF_BENCH(return (new MemsetBench<uint16_t, true>(10000)));
  70. DEF_BENCH(return (new MemsetBench<uint16_t, false>(10000)));
  71. DEF_BENCH(return (new MemsetBench<uint16_t, true>(100000)));
  72. DEF_BENCH(return (new MemsetBench<uint16_t, false>(100000)));