09ddcc3a68bd0863ea860d8c5a342b97d665d0ed
[WebKit.git] / PerformanceTests / MallocBench / MallocBench / big.cpp
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "CPUCount.h"
27 #include "big.h"
28 #include <algorithm>
29 #include <cstddef>
30 #include <cstdlib>
31 #include <strings.h>
32
33 #include "mbmalloc.h"
34
35 using namespace std;
36
37 struct Object {
38     double* p;
39     size_t size;
40 };
41
42 void benchmark_big(CommandLine& commandLine)
43 {
44     size_t times = 1;
45
46     size_t vmSize = 1ul * 1024 * 1024 * 1024;
47     size_t objectSizeMin = 4 * 1024;
48     size_t objectSizeMax = 64 * 1024;
49     if (commandLine.isParallel())
50         vmSize /= cpuCount();
51
52     size_t objectCount = vmSize / objectSizeMin;
53
54     srandom(0); // For consistency between runs.
55
56     for (size_t i = 0; i < times; ++i) {
57         Object* objects = (Object*)mbmalloc(objectCount * sizeof(Object));
58         bzero(objects, objectCount * sizeof(Object));
59
60         for (size_t i = 0, remaining = vmSize; remaining > objectSizeMin; ++i) {
61             size_t size = min(remaining, max(objectSizeMin, random() % objectSizeMax));
62             objects[i] = { (double*)mbmalloc(size), size };
63             bzero(objects[i].p, size);
64             remaining -= size;
65         }
66
67         for (size_t i = 0; i < objectCount && objects[i].p; ++i)
68             mbfree(objects[i].p, objects[i].size);
69
70         mbfree(objects, objectCount * sizeof(Object));
71     }
72 }