Diff
Modified: trunk/CMakeLists.txt (222899 => 222900)
--- trunk/CMakeLists.txt 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/CMakeLists.txt 2017-10-05 07:05:44 UTC (rev 222900)
@@ -166,6 +166,8 @@
add_subdirectory(Tools)
endif ()
+add_subdirectory(PerformanceTests)
+
# -----------------------------------------------------------------------------
# Print the features list last, for maximum visibility.
# -----------------------------------------------------------------------------
Modified: trunk/ChangeLog (222899 => 222900)
--- trunk/ChangeLog 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/ChangeLog 2017-10-05 07:05:44 UTC (rev 222900)
@@ -1,3 +1,12 @@
+2017-10-05 Yusuke Suzuki <[email protected]>
+
+ [Linux] Port MallocBench
+ https://bugs.webkit.org/show_bug.cgi?id=177856
+
+ Reviewed by Filip Pizlo.
+
+ * CMakeLists.txt:
+
2017-10-04 Ryan Haddad <[email protected]>
Unreviewed, rolling out r222840.
Added: trunk/PerformanceTests/CMakeLists.txt (0 => 222900)
--- trunk/PerformanceTests/CMakeLists.txt (rev 0)
+++ trunk/PerformanceTests/CMakeLists.txt 2017-10-05 07:05:44 UTC (rev 222900)
@@ -0,0 +1,5 @@
+if (NOT USE_SYSTEM_MALLOC)
+ add_subdirectory(MallocBench)
+endif ()
+
+WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()
Modified: trunk/PerformanceTests/ChangeLog (222899 => 222900)
--- trunk/PerformanceTests/ChangeLog 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/ChangeLog 2017-10-05 07:05:44 UTC (rev 222900)
@@ -1,3 +1,65 @@
+2017-10-05 Yusuke Suzuki <[email protected]>
+
+ [Linux] Port MallocBench
+ https://bugs.webkit.org/show_bug.cgi?id=177856
+
+ Reviewed by Filip Pizlo.
+
+ We would like to optimize locking in bmalloc in Linux by using futex APIs. So we should have
+ the way to ensure this actually improves / does not regress the performance.
+
+ This patch ports MallocBench to Linux to measure/ensure the effect of bmalloc patch in Linux.
+
+ While we replace the dispatch serial queue in message.cpp, we still use libdispatch in Benchmark.cpp
+ since we do not have priority mechanism in C++11 threading implementation.
+
+ We also extend run-malloc-benchmarks to accept cmake style layout of build product directory.
+ And we also support building MallocBench in CMake environment including CMake Mac ports.
+ Currently, we do not support Windows yet.
+
+ Based on the measurement, we can say the following observation. glibc's malloc performance is not
+ so bad. While bmalloc shows 3.8x (in geomean) performance improvement, bmalloc in Linux shows 2.0x
+ improvement. Since both numbers in bmalloc are similar, we can think that bmalloc's optimization is
+ actually working in Linux too. And even though glibc's malloc perofmrnace is not so bad, bmalloc
+ still offers performance improvement.
+
+ * CMakeLists.txt: Added.
+ * MallocBench/CMakeLists.txt: Added.
+ * MallocBench/MallocBench.xcodeproj/project.pbxproj:
+ * MallocBench/MallocBench/Benchmark.cpp:
+ (Benchmark::Benchmark):
+ (Benchmark::runOnce):
+ (Benchmark::currentMemoryBytes): Deleted.
+ * MallocBench/MallocBench/Benchmark.h:
+ (Benchmark::Memory::Memory): Deleted.
+ (Benchmark::Memory::operator-): Deleted.
+ * MallocBench/MallocBench/CMakeLists.txt: Added.
+ * MallocBench/MallocBench/CPUCount.cpp:
+ (cpuCount):
+ * MallocBench/MallocBench/Interpreter.cpp:
+ (Interpreter::doMallocOp):
+ * MallocBench/MallocBench/Memory.cpp: Added.
+ (currentMemoryBytes):
+ * MallocBench/MallocBench/Memory.h: Copied from PerformanceTests/MallocBench/MallocBench/CPUCount.cpp.
+ (Memory::Memory):
+ (Memory::operator-):
+ * MallocBench/MallocBench/balloon.cpp:
+ (benchmark_balloon):
+ * MallocBench/MallocBench/mbmalloc.cpp:
+ * MallocBench/MallocBench/message.cpp:
+ (WorkQueue::WorkQueue):
+ (WorkQueue::~WorkQueue):
+ (WorkQueue::dispatchAsync):
+ (WorkQueue::dispatchSync):
+ (benchmark_message_one):
+ (benchmark_message_many):
+ * MallocBench/MallocBench/nimlang.cpp:
+ (benchmark_nimlang):
+ * MallocBench/MallocBench/stress.cpp:
+ (SizeStream::next):
+ * MallocBench/MallocBench/stress_aligned.cpp:
+ * MallocBench/run-malloc-benchmarks:
+
2017-09-26 Mathias Bynens <[email protected]>
Speedometer: ensure all TodoMVC tests use the complete latest CSS
Added: trunk/PerformanceTests/MallocBench/CMakeLists.txt (0 => 222900)
--- trunk/PerformanceTests/MallocBench/CMakeLists.txt (rev 0)
+++ trunk/PerformanceTests/MallocBench/CMakeLists.txt 2017-10-05 07:05:44 UTC (rev 222900)
@@ -0,0 +1 @@
+add_subdirectory(MallocBench)
Modified: trunk/PerformanceTests/MallocBench/MallocBench/Benchmark.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/Benchmark.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/Benchmark.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -42,16 +42,20 @@
#include "stress_aligned.h"
#include "theverge.h"
#include "tree.h"
-#include <dispatch/dispatch.h>
+#include <algorithm>
#include <iostream>
-#include <mach/mach.h>
-#include <mach/task_info.h>
#include <map>
+#include <stdio.h>
#include <string>
+#include <strings.h>
#include <sys/time.h>
#include <thread>
-#include <unistd.h>
+#include <vector>
+#ifdef __APPLE__
+#include <dispatch/dispatch.h>
+#endif
+
#include "mbmalloc.h"
using namespace std;
@@ -130,9 +134,7 @@
}
Benchmark::Benchmark(CommandLine& commandLine)
- : m_benchmarkPair()
- , m_elapsedTime()
- , m_commandLine(commandLine)
+ : m_commandLine(commandLine)
{
const BenchmarkPair* benchmarkPair = std::find(
benchmarkPairs, benchmarkPairs + benchmarksPairsCount, m_commandLine.benchmarkName());
@@ -156,6 +158,7 @@
return;
}
+#ifdef __APPLE__
dispatch_group_t group = dispatch_group_create();
for (size_t i = 0; i < cpuCount(); ++i) {
@@ -167,6 +170,16 @@
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);
+#else
+ std::vector<std::thread> threads;
+ for (size_t i = 0; i < cpuCount(); ++i) {
+ threads.emplace_back([&] {
+ m_benchmarkPair->function(m_commandLine);
+ });
+ }
+ for (auto& thread : threads)
+ thread.join();
+#endif
}
void Benchmark::run()
@@ -212,18 +225,3 @@
return (now.tv_sec * 1000.0) + now.tv_usec / 1000.0;
}
-Benchmark::Memory Benchmark::currentMemoryBytes()
-{
- Memory memory;
-
- task_vm_info_data_t vm_info;
- mach_msg_type_number_t vm_size = TASK_VM_INFO_COUNT;
- if (KERN_SUCCESS != task_info(mach_task_self(), TASK_VM_INFO_PURGEABLE, (task_info_t)(&vm_info), &vm_size)) {
- cout << "Failed to get mach task info" << endl;
- exit(1);
- }
-
- memory.resident = vm_info.internal + vm_info.compressed - vm_info.purgeable_volatile_pmap;
- memory.residentMax = vm_info.resident_size_peak;
- return memory;
-}
Modified: trunk/PerformanceTests/MallocBench/MallocBench/Benchmark.h (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/Benchmark.h 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/Benchmark.h 2017-10-05 07:05:44 UTC (rev 222900)
@@ -27,6 +27,7 @@
#define Benchmark_h
#include "CommandLine.h"
+#include "Memory.h"
#include <map>
#include <string>
@@ -35,30 +36,7 @@
class Benchmark {
public:
- struct Memory {
- Memory()
- : resident()
- , residentMax()
- {
- }
-
- Memory(size_t resident, size_t residentMax)
- : resident(resident)
- , residentMax(residentMax)
- {
- }
-
- Memory operator-(const Memory& other)
- {
- return Memory(resident - other.resident, residentMax - other.residentMax);
- }
-
- size_t resident;
- size_t residentMax;
- };
-
static double currentTimeMS();
- static Memory currentMemoryBytes();
Benchmark(CommandLine&);
@@ -75,12 +53,12 @@
MapType m_map;
- const BenchmarkPair* m_benchmarkPair;
+ const BenchmarkPair* m_benchmarkPair { nullptr };
CommandLine& m_commandLine;
Memory m_memory;
- double m_elapsedTime;
+ double m_elapsedTime { 0 };
};
#endif // Benchmark_h
Added: trunk/PerformanceTests/MallocBench/MallocBench/CMakeLists.txt (0 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/CMakeLists.txt (rev 0)
+++ trunk/PerformanceTests/MallocBench/MallocBench/CMakeLists.txt 2017-10-05 07:05:44 UTC (rev 222900)
@@ -0,0 +1,69 @@
+add_library(sysmalloc SHARED mbmalloc.cpp)
+set_target_properties(sysmalloc PROPERTIES OUTPUT_NAME "mbmalloc")
+set_target_properties(sysmalloc PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib/system/)
+
+set(MALLOC_BENCH_SOURCES
+ Benchmark.cpp
+ CPUCount.cpp
+ CommandLine.cpp
+ Interpreter.cpp
+ Memory.cpp
+ alloc_free.cpp
+ balloon.cpp
+ big.cpp
+ churn.cpp
+ facebook.cpp
+ flickr.cpp
+ fragment.cpp
+ list.cpp
+ main.cpp
+ medium.cpp
+ message.cpp
+ nimlang.cpp
+ realloc.cpp
+ reddit.cpp
+ stress.cpp
+ stress_aligned.cpp
+ theverge.cpp
+ tree.cpp
+)
+
+set(MALLOC_BENCH_INCLUDE_DIRECTORIES
+ "${BMALLOC_DIR}"
+ "${CMAKE_BINARY_DIR}"
+ "${DERIVED_SOURCES_DIR}"
+ "${THIRDPARTY_DIR}"
+)
+
+set(MALLOC_BENCH_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()
+
+WEBKIT_WRAP_SOURCELIST(${MALLOC_BENCH_SOURCES})
+
+
+include_directories(${MALLOC_BENCH_INCLUDE_DIRECTORIES})
+
+SET(CMAKE_SKIP_BUILD_RPATH TRUE)
+add_executable(MallocBench ${MALLOC_BENCH_SOURCES})
+target_link_libraries(MallocBench ${CMAKE_THREAD_LIBS_INIT} ${MALLOC_BENCH_LIBRARIES} mbmalloc)
+add_dependencies(MallocBench sysmalloc mbmalloc)
+
+set(MALLOC_BENCH_OPS
+ facebook.ops
+ flickr.ops
+ flickr_memory_warning.ops
+ nimlang.ops
+ reddit.ops
+ reddit_memory_warning.ops
+ theverge.ops
+ theverge_memory_warning.ops
+)
+
+file(COPY
+ ${MALLOC_BENCH_OPS}
+ DESTINATION
+ ${PROJECT_BINARY_DIR}
+)
Modified: trunk/PerformanceTests/MallocBench/MallocBench/CPUCount.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/CPUCount.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/CPUCount.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -28,6 +28,7 @@
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/types.h>
+#include <unistd.h>
static size_t count;
@@ -36,6 +37,7 @@
if (count)
return count;
+#ifdef __APPLE__
size_t length = sizeof(count);
int name[] = {
CTL_HW,
@@ -44,6 +46,12 @@
int sysctlResult = sysctl(name, sizeof(name) / sizeof(int), &count, &length, 0, 0);
if (sysctlResult < 0)
abort();
+#else
+ long sysconfResult = sysconf(_SC_NPROCESSORS_ONLN);
+ if (sysconfResult < 0)
+ abort();
+ count = sysconfResult;
+#endif
return count;
}
Modified: trunk/PerformanceTests/MallocBench/MallocBench/Interpreter.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/Interpreter.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/Interpreter.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -227,7 +227,7 @@
return result;
}
-void Interpreter::doMallocOp(Op op, ThreadId threadId)
+void Interpreter::doMallocOp(Op op, ThreadId)
{
switch (op.opcode) {
case op_malloc: {
Added: trunk/PerformanceTests/MallocBench/MallocBench/Memory.cpp (0 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/Memory.cpp (rev 0)
+++ trunk/PerformanceTests/MallocBench/MallocBench/Memory.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Yusuke Suzuki <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "Memory.h"
+#include <iostream>
+#include <stdlib.h>
+
+#ifdef __APPLE__
+#include <mach/mach.h>
+#include <mach/task_info.h>
+#else
+#include <stdio.h>
+#include <unistd.h>
+#endif
+
+Memory currentMemoryBytes()
+{
+ Memory memory;
+
+#ifdef __APPLE__
+ task_vm_info_data_t vm_info;
+ mach_msg_type_number_t vm_size = TASK_VM_INFO_COUNT;
+ if (KERN_SUCCESS != task_info(mach_task_self(), TASK_VM_INFO_PURGEABLE, (task_info_t)(&vm_info), &vm_size)) {
+ std::cout << "Failed to get mach task info" << std::endl;
+ exit(1);
+ }
+
+ memory.resident = vm_info.internal + vm_info.compressed - vm_info.purgeable_volatile_pmap;
+ memory.residentMax = vm_info.resident_size_peak;
+#else
+ FILE* file = fopen("/proc/self/status", "r");
+
+ auto forEachLine = [] (FILE* file, auto functor) {
+ char* buffer = nullptr;
+ size_t size = 0;
+ while (getline(&buffer, &size, file) != -1) {
+ functor(buffer, size);
+ ::free(buffer); // Be careful. getline's memory allocation is done by system malloc.
+ buffer = nullptr;
+ size = 0;
+ }
+ };
+
+ unsigned long vmHWM = 0;
+ unsigned long vmRSS = 0;
+ unsigned long rssFile = 0;
+ unsigned long rssShmem = 0;
+ forEachLine(file, [&] (char* buffer, size_t) {
+ unsigned long sizeInKB = 0;
+ if (sscanf(buffer, "VmHWM: %lu kB", &sizeInKB) == 1)
+ vmHWM = sizeInKB * 1024;
+ else if (sscanf(buffer, "VmRSS: %lu kB", &sizeInKB) == 1)
+ vmRSS = sizeInKB * 1024;
+ else if (sscanf(buffer, "RssFile: %lu kB", &sizeInKB) == 1)
+ rssFile = sizeInKB * 1024;
+ else if (sscanf(buffer, "RssShmem: %lu kB", &sizeInKB) == 1)
+ rssShmem = sizeInKB * 1024;
+ });
+ fclose(file);
+ memory.resident = vmRSS - (rssFile + rssShmem);
+ memory.residentMax = vmHWM - (rssFile + rssShmem); // We do not have any way to get the peak of RSS of anonymous pages. Here, we subtract RSS of files and shmem to estimate the peak of RSS of anonymous pages.
+#endif
+ return memory;
+}
Copied: trunk/PerformanceTests/MallocBench/MallocBench/Memory.h (from rev 222899, trunk/PerformanceTests/MallocBench/MallocBench/CPUCount.cpp) (0 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/Memory.h (rev 0)
+++ trunk/PerformanceTests/MallocBench/MallocBench/Memory.h 2017-10-05 07:05:44 UTC (rev 222900)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Yusuke Suzuki <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <cstddef>
+
+struct Memory {
+ Memory()
+ : resident()
+ , residentMax()
+ {
+ }
+
+ Memory(size_t resident, size_t residentMax)
+ : resident(resident)
+ , residentMax(residentMax)
+ {
+ }
+
+ Memory operator-(const Memory& other)
+ {
+ return Memory(resident - other.resident, residentMax - other.residentMax);
+ }
+
+ size_t resident;
+ size_t residentMax;
+};
+
+Memory currentMemoryBytes();
Modified: trunk/PerformanceTests/MallocBench/MallocBench/balloon.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/balloon.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/balloon.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -23,13 +23,14 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "Benchmark.h"
#include "CPUCount.h"
+#include "Memory.h"
#include "balloon.h"
#include <array>
#include <chrono>
#include <memory>
#include <stddef.h>
+#include <strings.h>
#include "mbmalloc.h"
@@ -61,7 +62,7 @@
// Converts bytes to time -- for reporting's sake -- by waiting a while until
// the heap shrinks back down. This isn't great for pooling with other
// benchmarks in a geometric mean of throughput, but it's OK for basic testing.
- while (Benchmark::currentMemoryBytes().resident > 2 * steadySize
+ while (currentMemoryBytes().resident > 2 * steadySize
&& std::chrono::steady_clock::now() - start < 8 * benchmarkTime) {
for (size_t i = 0; i < steady.size(); ++i) {
steady[i] = mbmalloc(chunkSize);
Modified: trunk/PerformanceTests/MallocBench/MallocBench/mbmalloc.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/mbmalloc.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/mbmalloc.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -26,7 +26,12 @@
#include <limits>
#include <stdio.h>
#include <stdlib.h>
+
+#ifdef __APPLE__
#import <malloc/malloc.h>
+#else
+#include <malloc.h>
+#endif
extern "C" {
@@ -38,7 +43,8 @@
void* mbmemalign(size_t alignment, size_t size)
{
void* result;
- posix_memalign(&result, alignment, size);
+ if (posix_memalign(&result, alignment, size))
+ return nullptr;
return result;
}
@@ -54,7 +60,11 @@
void mbscavenge()
{
+#ifdef __APPLE__
malloc_zone_pressure_relief(nullptr, 0);
+#else
+ malloc_trim(0);
+#endif
}
} // extern "C"
Modified: trunk/PerformanceTests/MallocBench/MallocBench/message.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/message.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/message.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -25,9 +25,13 @@
#include "CPUCount.h"
#include "message.h"
-#include <dispatch/dispatch.h>
+#include <condition_variable>
+#include <deque>
+#include <functional>
+#include <mutex>
#include <stdlib.h>
#include <strings.h>
+#include <thread>
#include "mbmalloc.h"
@@ -110,6 +114,68 @@
} // namespace
+class WorkQueue {
+public:
+ WorkQueue()
+ {
+ m_thread = std::thread([&] {
+ while (true) {
+ std::function<void()> target;
+ {
+ std::unique_lock<std::mutex> locker(m_mutex);
+ m_condition.wait(locker, [&] { return !m_queue.empty(); });
+ auto queued = m_queue.front();
+ m_queue.pop_front();
+ if (!queued)
+ return;
+ target = std::move(queued);
+ }
+ target();
+ }
+ });
+ }
+
+ ~WorkQueue() {
+ {
+ std::unique_lock<std::mutex> locker(m_mutex);
+ m_queue.push_back(nullptr);
+ m_condition.notify_one();
+ }
+ m_thread.join();
+ }
+
+ void dispatchAsync(std::function<void()> target)
+ {
+ std::unique_lock<std::mutex> locker(m_mutex);
+ m_queue.push_back(target);
+ m_condition.notify_one();
+ }
+
+ void dispatchSync(std::function<void()> target)
+ {
+ std::mutex syncMutex;
+ std::condition_variable syncCondition;
+
+ std::unique_lock<std::mutex> locker(syncMutex);
+ bool done = false;
+ dispatchAsync([&] {
+ target();
+ {
+ std::unique_lock<std::mutex> locker(syncMutex);
+ done = true;
+ syncCondition.notify_one();
+ }
+ });
+ syncCondition.wait(locker, [&] { return done; });
+ }
+
+private:
+ std::mutex m_mutex;
+ std::condition_variable m_condition;
+ std::deque<std::function<void()>> m_queue;
+ std::thread m_thread;
+};
+
void benchmark_message_one(CommandLine& commandLine)
{
if (commandLine.isParallel())
@@ -118,12 +184,11 @@
const size_t times = 2048;
const size_t quantum = 16;
- dispatch_queue_t queue = dispatch_queue_create("message", 0);
-
+ WorkQueue workQueue;
for (size_t i = 0; i < times; i += quantum) {
for (size_t j = 0; j < quantum; ++j) {
Message* message = new Message;
- dispatch_async(queue, ^{
+ workQueue.dispatchAsync([message] {
size_t hash = message->hash();
if (hash)
abort();
@@ -130,12 +195,9 @@
delete message;
});
}
- dispatch_sync(queue, ^{ });
+ workQueue.dispatchSync([] { });
}
-
- dispatch_sync(queue, ^{ });
-
- dispatch_release(queue);
+ workQueue.dispatchSync([] { });
}
void benchmark_message_many(CommandLine& commandLine)
@@ -147,15 +209,15 @@
const size_t quantum = 16;
const size_t queueCount = cpuCount() - 1;
- dispatch_queue_t queues[queueCount];
+ std::unique_ptr<WorkQueue> queues[queueCount];
for (size_t i = 0; i < queueCount; ++i)
- queues[i] = dispatch_queue_create("message", 0);
+ queues[i] = std::make_unique<WorkQueue>();
for (size_t i = 0; i < times; i += quantum) {
for (size_t j = 0; j < quantum; ++j) {
for (size_t k = 0; k < queueCount; ++k) {
Message* message = new Message;
- dispatch_async(queues[k], ^{
+ queues[k]->dispatchAsync([message] {
size_t hash = message->hash();
if (hash)
abort();
@@ -165,12 +227,9 @@
}
for (size_t i = 0; i < queueCount; ++i)
- dispatch_sync(queues[i], ^{ });
+ queues[i]->dispatchSync([] { });
}
for (size_t i = 0; i < queueCount; ++i)
- dispatch_sync(queues[i], ^{ });
-
- for (size_t i = 0; i < queueCount; ++i)
- dispatch_release(queues[i]);
+ queues[i]->dispatchSync([] { });
}
Modified: trunk/PerformanceTests/MallocBench/MallocBench/nimlang.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/nimlang.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/nimlang.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -51,6 +51,6 @@
for (size_t i = 0; i < times; ++i)
interpreter.run();
- if (commandLine.detailedReport())
- interpreter.detailedReport();
+ if (commandLine.detailedReport())
+ interpreter.detailedReport();
}
Modified: trunk/PerformanceTests/MallocBench/MallocBench/stress.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/stress.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/stress.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -27,6 +27,7 @@
#include "CPUCount.h"
#include "stress.h"
#include <array>
+#include <cassert>
#include <chrono>
#include <cstdlib>
#include <memory>
@@ -86,6 +87,8 @@
return random() % largeMax;
}
}
+ assert(0);
+ return 0;
}
private:
Modified: trunk/PerformanceTests/MallocBench/MallocBench/stress_aligned.cpp (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench/stress_aligned.cpp 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench/stress_aligned.cpp 2017-10-05 07:05:44 UTC (rev 222900)
@@ -27,6 +27,7 @@
#include "CPUCount.h"
#include "stress_aligned.h"
#include <array>
+#include <cassert>
#include <chrono>
#include <cmath>
#include <cstdlib>
@@ -89,6 +90,8 @@
return random() % largeMax;
}
}
+ assert(0);
+ return 0;
}
private:
Modified: trunk/PerformanceTests/MallocBench/MallocBench.xcodeproj/project.pbxproj (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/MallocBench.xcodeproj/project.pbxproj 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/MallocBench.xcodeproj/project.pbxproj 2017-10-05 07:05:44 UTC (rev 222900)
@@ -40,6 +40,7 @@
14FCA36119A7C917001CFDA9 /* stress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14FCA35F19A7C917001CFDA9 /* stress.cpp */; };
65E401A61C657A87003C6E9C /* nimlang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65E401A41C657A87003C6E9C /* nimlang.cpp */; };
65E401AC1C73B068003C6E9C /* alloc_free.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65E401AA1C73B068003C6E9C /* alloc_free.cpp */; };
+ E37681031F8529EF00617E4C /* Memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E37681011F8529EF00617E4C /* Memory.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -49,14 +50,14 @@
dstPath = "";
dstSubfolderSpec = 7;
files = (
+ 14C5009018401841007A531D /* facebook.ops in Copy Files */,
+ 1447AE9318FB588600B3D7FF /* flickr.ops in Copy Files */,
+ 1447AE9918FB59E000B3D7FF /* flickr_memory_warning.ops in Copy Files */,
1486502A1C7CF1CC008AABFE /* nimlang.ops in Copy Files */,
1447AE9418FB589400B3D7FF /* reddit.ops in Copy Files */,
- 1447AE9918FB59E000B3D7FF /* flickr_memory_warning.ops in Copy Files */,
- 1447AE9B18FB59E600B3D7FF /* theverge_memory_warning.ops in Copy Files */,
1447AE9A18FB59E300B3D7FF /* reddit_memory_warning.ops in Copy Files */,
1447AE9518FB58A300B3D7FF /* theverge.ops in Copy Files */,
- 1447AE9318FB588600B3D7FF /* flickr.ops in Copy Files */,
- 14C5009018401841007A531D /* facebook.ops in Copy Files */,
+ 1447AE9B18FB59E600B3D7FF /* theverge_memory_warning.ops in Copy Files */,
);
name = "Copy Files";
runOnlyForDeploymentPostprocessing = 0;
@@ -120,6 +121,8 @@
65E401A51C657A87003C6E9C /* nimlang.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nimlang.h; path = MallocBench/nimlang.h; sourceTree = "<group>"; };
65E401AA1C73B068003C6E9C /* alloc_free.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = alloc_free.cpp; path = MallocBench/alloc_free.cpp; sourceTree = "<group>"; };
65E401AB1C73B068003C6E9C /* alloc_free.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = alloc_free.h; path = MallocBench/alloc_free.h; sourceTree = "<group>"; };
+ E37681011F8529EF00617E4C /* Memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Memory.cpp; sourceTree = "<group>"; };
+ E37681021F8529EF00617E4C /* Memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Memory.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -146,9 +149,9 @@
isa = PBXGroup;
children = (
14E11933177F51AC003A8D15 /* Benchmarks */,
+ 1447AE8618FB4B5100B3D7FF /* Libraries */,
14452CAE177D24460097E057 /* MallocBench */,
14CC391B18EA6722004AFE34 /* mbmalloc */,
- 1447AE8618FB4B5100B3D7FF /* Libraries */,
14452CAA177D24460097E057 /* Products */,
);
sourceTree = "<group>";
@@ -174,6 +177,8 @@
14C5009118403DA0007A531D /* Interpreter.cpp */,
14C5009218403DA0007A531D /* Interpreter.h */,
14452CAF177D24460097E057 /* main.cpp */,
+ E37681011F8529EF00617E4C /* Memory.cpp */,
+ E37681021F8529EF00617E4C /* Memory.h */,
);
path = MallocBench;
sourceTree = "<group>";
@@ -209,10 +214,10 @@
14C5008B184016CF007A531D /* facebook.cpp */,
14C5008C184016CF007A531D /* facebook.h */,
14C5008E18401726007A531D /* facebook.ops */,
- 1447AE9618FB59D900B3D7FF /* flickr_memory_warning.ops */,
1447AE8718FB584200B3D7FF /* flickr.cpp */,
1447AE8818FB584200B3D7FF /* flickr.h */,
1447AE8918FB584200B3D7FF /* flickr.ops */,
+ 1447AE9618FB59D900B3D7FF /* flickr_memory_warning.ops */,
1444AE91177E79BB00F8030A /* fragment.cpp */,
1444AE92177E79BB00F8030A /* fragment.h */,
14976EC6177E3649006B819A /* list.cpp */,
@@ -221,23 +226,23 @@
1451FAEC18B14B7100DB6D47 /* medium.h */,
1444AE94177E8DF200F8030A /* message.cpp */,
1444AE95177E8DF200F8030A /* message.h */,
- 14105E8018E13EEC003A106E /* realloc.cpp */,
65E401A41C657A87003C6E9C /* nimlang.cpp */,
65E401A51C657A87003C6E9C /* nimlang.h */,
148650291C7CF182008AABFE /* nimlang.ops */,
+ 14105E8018E13EEC003A106E /* realloc.cpp */,
14105E8118E13EEC003A106E /* realloc.h */,
- 1447AE9718FB59D900B3D7FF /* reddit_memory_warning.ops */,
1447AE8A18FB584200B3D7FF /* reddit.cpp */,
1447AE8B18FB584200B3D7FF /* reddit.h */,
1447AE8C18FB584200B3D7FF /* reddit.ops */,
+ 1447AE9718FB59D900B3D7FF /* reddit_memory_warning.ops */,
14FCA35F19A7C917001CFDA9 /* stress.cpp */,
14FCA36019A7C917001CFDA9 /* stress.h */,
14D0BFF11A6F4D3B00109F31 /* stress_aligned.cpp */,
14D0BFF21A6F4D3B00109F31 /* stress_aligned.h */,
- 1447AE9818FB59D900B3D7FF /* theverge_memory_warning.ops */,
1447AE8D18FB584200B3D7FF /* theverge.cpp */,
1447AE8E18FB584200B3D7FF /* theverge.h */,
1447AE8F18FB584200B3D7FF /* theverge.ops */,
+ 1447AE9818FB59D900B3D7FF /* theverge_memory_warning.ops */,
14976ECF177E4AF7006B819A /* tree.cpp */,
14976ED0177E4AF7006B819A /* tree.h */,
);
@@ -323,28 +328,29 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 65E401AC1C73B068003C6E9C /* alloc_free.cpp in Sources */,
+ 14105E7F18DF7D73003A106E /* balloon.cpp in Sources */,
+ 14976ECE177E3D67006B819A /* Benchmark.cpp in Sources */,
14CE4A6017BD355800288DAA /* big.cpp in Sources */,
- 14976ED1177E4AF7006B819A /* tree.cpp in Sources */,
- 1444AE96177E8DF200F8030A /* message.cpp in Sources */,
- 65E401AC1C73B068003C6E9C /* alloc_free.cpp in Sources */,
14452CEF177D47110097E057 /* churn.cpp in Sources */,
- 14452CB0177D24460097E057 /* main.cpp in Sources */,
- 14FCA36119A7C917001CFDA9 /* stress.cpp in Sources */,
+ 14976ECC177E3C87006B819A /* CommandLine.cpp in Sources */,
+ 14E11932177ECC8B003A8D15 /* CPUCount.cpp in Sources */,
14C5008D184016CF007A531D /* facebook.cpp in Sources */,
1447AE9018FB584200B3D7FF /* flickr.cpp in Sources */,
+ 1444AE93177E79BB00F8030A /* fragment.cpp in Sources */,
+ 14C5009318403DA0007A531D /* Interpreter.cpp in Sources */,
14976EC8177E3649006B819A /* list.cpp in Sources */,
- 14976ECC177E3C87006B819A /* CommandLine.cpp in Sources */,
+ 14452CB0177D24460097E057 /* main.cpp in Sources */,
+ 1451FAED18B14B7100DB6D47 /* medium.cpp in Sources */,
+ E37681031F8529EF00617E4C /* Memory.cpp in Sources */,
+ 1444AE96177E8DF200F8030A /* message.cpp in Sources */,
65E401A61C657A87003C6E9C /* nimlang.cpp in Sources */,
+ 14105E8218E13EEC003A106E /* realloc.cpp in Sources */,
+ 1447AE9118FB584200B3D7FF /* reddit.cpp in Sources */,
+ 14FCA36119A7C917001CFDA9 /* stress.cpp in Sources */,
+ 14D0BFF31A6F4D3B00109F31 /* stress_aligned.cpp in Sources */,
1447AE9218FB584200B3D7FF /* theverge.cpp in Sources */,
- 14D0BFF31A6F4D3B00109F31 /* stress_aligned.cpp in Sources */,
- 1451FAED18B14B7100DB6D47 /* medium.cpp in Sources */,
- 14C5009318403DA0007A531D /* Interpreter.cpp in Sources */,
- 1447AE9118FB584200B3D7FF /* reddit.cpp in Sources */,
- 14E11932177ECC8B003A8D15 /* CPUCount.cpp in Sources */,
- 1444AE93177E79BB00F8030A /* fragment.cpp in Sources */,
- 14105E8218E13EEC003A106E /* realloc.cpp in Sources */,
- 14105E7F18DF7D73003A106E /* balloon.cpp in Sources */,
- 14976ECE177E3D67006B819A /* Benchmark.cpp in Sources */,
+ 14976ED1177E4AF7006B819A /* tree.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Modified: trunk/PerformanceTests/MallocBench/run-malloc-benchmarks (222899 => 222900)
--- trunk/PerformanceTests/MallocBench/run-malloc-benchmarks 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/PerformanceTests/MallocBench/run-malloc-benchmarks 2017-10-05 07:05:44 UTC (rev 222900)
@@ -7,6 +7,29 @@
$binDir = "#{File.expand_path(File.dirname(__FILE__))}"
$productDir = `perl -e 'use lib \"#{$binDir}/../../Tools/Scripts\"; use webkitdirs; print productDir()'`
+def determineOS
+ case RbConfig::CONFIG["host_os"]
+ when /darwin/i
+ "darwin"
+ when /linux/i
+ "linux"
+ when /mswin|mingw|cygwin/
+ "windows"
+ else
+ $stderr.puts "Warning: unable to determine host operating system"
+ nil
+ end
+end
+
+$hostOS = determineOS unless $hostOS
+$cmake = false
+
+if $hostOS == 'darwin'
+ $libraryExtension = "dylib"
+else
+ $libraryExtension = "so"
+end
+
$benchmarks_all = [
# Single-threaded benchmarks.
"churn",
@@ -91,7 +114,8 @@
puts "Options:"
puts
puts " --benchmark <benchmark> Select a single benchmark to run instead of the full suite."
- puts " --heap <heap> Set a baseline heap size."
+ puts " --heap <heap> Set a baseline heap size."
+ puts " --cmake Specify if build directory layout is for CMake."
puts
end
@@ -101,7 +125,7 @@
def initialize(name, path)
@name = name
- @path = File.join(path, "libmbmalloc.dylib")
+ @path = File.join(path, "libmbmalloc.#{$libraryExtension}")
end
end
@@ -214,6 +238,7 @@
def parseOptions
GetoptLong.new(
['--benchmark', GetoptLong::REQUIRED_ARGUMENT],
+ ['--cmake', GetoptLong::NO_ARGUMENT],
['--memory', GetoptLong::NO_ARGUMENT],
['--memory_warning', GetoptLong::NO_ARGUMENT],
['--heap', GetoptLong::REQUIRED_ARGUMENT],
@@ -227,6 +252,8 @@
$benchmarks = $benchmarks_memory
when '--memory_warning'
$benchmarks = $benchmarks_memory_warning
+ when '--cmake'
+ $cmake = true
when '--heap'
$heap = arg
when '--help'
@@ -237,6 +264,16 @@
end
}
+ if $cmake
+ $libraryDir = "#{$productDir}/lib"
+ $systemMallocLibraryDir = "#{$productDir}/lib/system"
+ $binaryDir = "#{$productDir}/bin"
+ else
+ $libraryDir = $productDir
+ $binaryDir = $productDir
+ $systemMallocLibraryDir = $productDir
+ end
+
if ARGV.length < 1
puts "Error: No dylib specified."
exit 1
@@ -246,9 +283,9 @@
ARGV.each {
| arg |
if arg == "SystemMalloc"
- dylib = Dylib.new("SystemMalloc", $productDir)
+ dylib = Dylib.new("SystemMalloc", $systemMallocLibraryDir)
elsif arg == "NanoMalloc"
- dylib = Dylib.new("NanoMalloc", $productDir)
+ dylib = Dylib.new("NanoMalloc", $libraryDir)
else
name = arg.split(":")[0]
path = arg.split(":")[1]
@@ -288,10 +325,11 @@
$stderr.print "\rRUNNING #{dylib.name}: #{benchmark}... "
env = "DYLD_LIBRARY_PATH='#{Pathname.new(dylib.path).dirname}' "
+ env += "LD_LIBRARY_PATH='#{Pathname.new(dylib.path).dirname}' "
if dylib.name == "NanoMalloc"
env += "MallocNanoZone=1 "
end
- input = "cd '#{$productDir}'; #{env} '#{$productDir}/MallocBench' --benchmark #{benchmark} --heap #{$heap}}"
+ input = "cd '#{$productDir}'; #{env} '#{$binaryDir}/MallocBench' --benchmark #{benchmark} --heap #{$heap}}"
output =`#{input}`
splitOutput = output.split("\n")
Modified: trunk/Source/bmalloc/CMakeLists.txt (222899 => 222900)
--- trunk/Source/bmalloc/CMakeLists.txt 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/Source/bmalloc/CMakeLists.txt 2017-10-05 07:05:44 UTC (rev 222900)
@@ -37,3 +37,7 @@
add_library(bmalloc STATIC ${bmalloc_SOURCES})
target_link_libraries(bmalloc ${bmalloc_LIBRARIES})
set_target_properties(bmalloc PROPERTIES COMPILE_DEFINITIONS "BUILDING_bmalloc")
+
+add_library(mbmalloc SHARED bmalloc/mbmalloc.cpp)
+target_link_libraries(mbmalloc bmalloc ${CMAKE_THREAD_LIBS_INIT} ${bmalloc_LIBRARIES})
+set_target_properties(mbmalloc PROPERTIES COMPILE_DEFINITIONS "BUILDING_mbmalloc")
Modified: trunk/Source/bmalloc/ChangeLog (222899 => 222900)
--- trunk/Source/bmalloc/ChangeLog 2017-10-05 06:33:56 UTC (rev 222899)
+++ trunk/Source/bmalloc/ChangeLog 2017-10-05 07:05:44 UTC (rev 222900)
@@ -1,3 +1,12 @@
+2017-10-05 Yusuke Suzuki <[email protected]>
+
+ [Linux] Port MallocBench
+ https://bugs.webkit.org/show_bug.cgi?id=177856
+
+ Reviewed by Filip Pizlo.
+
+ * CMakeLists.txt:
+
2017-10-04 Filip Pizlo <[email protected]>
bmalloc mutex should be adaptive