180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchmark.h"
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRefCnt.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkThread.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkWeakRefCnt.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <memory>
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum {
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    N = SkBENCHLOOP(100000),
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    M = SkBENCHLOOP(2)
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RefCntBench_Stack : public SkBenchmark {
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    RefCntBench_Stack(void* param) : INHERITED(param) {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRendering = false;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return "ref_cnt_stack";
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkRefCnt ref;
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int j = 0; j < M; ++j) {
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref.ref();
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref.unref();
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PlacedRefCnt : public SkRefCnt {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_INST_COUNT(PlacedRefCnt)
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    PlacedRefCnt() : SkRefCnt() { }
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void operator delete(void *p) { }
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkRefCnt INHERITED;
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_DEFINE_INST_COUNT(PlacedRefCnt)
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RefCntBench_Heap : public SkBenchmark {
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    RefCntBench_Heap(void* param) : INHERITED(param) {
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRendering = false;
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return "ref_cnt_heap";
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        char memory[sizeof(PlacedRefCnt)];
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            PlacedRefCnt* ref = new (memory) PlacedRefCnt();
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int j = 0; j < M; ++j) {
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->ref();
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->unref();
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            ref->unref();
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RefCntBench_New : public SkBenchmark {
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    RefCntBench_New(void* param) : INHERITED(param) {
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRendering = false;
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return "ref_cnt_new";
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkRefCnt* ref = new SkRefCnt();
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int j = 0; j < M; ++j) {
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->ref();
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->unref();
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            ref->unref();
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass WeakRefCntBench_Stack : public SkBenchmark {
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    WeakRefCntBench_Stack(void* param) : INHERITED(param) {
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRendering = false;
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return "ref_cnt_stack_weak";
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkWeakRefCnt ref;
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int j = 0; j < M; ++j) {
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref.ref();
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref.unref();
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PlacedWeakRefCnt : public SkWeakRefCnt {
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    PlacedWeakRefCnt() : SkWeakRefCnt() { }
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void operator delete(void *p) { }
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass WeakRefCntBench_Heap : public SkBenchmark {
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    WeakRefCntBench_Heap(void* param) : INHERITED(param) {
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRendering = false;
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return "ref_cnt_heap_weak";
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        char memory[sizeof(PlacedWeakRefCnt)];
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt();
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int j = 0; j < M; ++j) {
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->ref();
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->unref();
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            ref->unref();
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass WeakRefCntBench_New : public SkBenchmark {
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    WeakRefCntBench_New(void* param) : INHERITED(param) {
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRendering = false;
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return "ref_cnt_new_weak";
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkWeakRefCnt* ref = new SkWeakRefCnt();
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int j = 0; j < M; ++j) {
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->ref();
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                ref->unref();
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            ref->unref();
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact00(void* p) { return new RefCntBench_Stack(p); }
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact01(void* p) { return new RefCntBench_Heap(p); }
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact02(void* p) { return new RefCntBench_New(p); }
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact10(void* p) { return new WeakRefCntBench_Stack(p); }
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact11(void* p) { return new WeakRefCntBench_Heap(p); }
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact12(void* p) { return new WeakRefCntBench_New(p); }
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg00(Fact00);
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg01(Fact01);
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg02(Fact02);
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg10(Fact10);
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg11(Fact11);
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg12(Fact12);
206