Path: blob/main/test/benchmark/benchmark_memset.cpp
4133 views
// Copyright 2017 The Emscripten Authors. All rights reserved.1// Emscripten is available under two separate licenses, the MIT license and the2// University of Illinois/NCSA Open Source License. Both these licenses can be3// found in the LICENSE file.45#include <string.h>6#include <stdio.h>7#include <stdlib.h>8#include <vector>9#include <iostream>10#include <algorithm>1112#ifdef WIN3213#include <Windows.h>14#define aligned_alloc(align, size) _aligned_malloc((size), (align))15#endif1617#ifdef __EMSCRIPTEN__18#include <emscripten/emscripten.h>19#endif2021#include "tick.h"2223char dst[1024*1024*64+16] = {};2425uint8_t resultCheckSum = 0;2627void __attribute__((noinline)) test_memset(int numTimes, int copySize)28{29for(int i = 0; i < numTimes - 8; i += 8)30{31memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];32memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];33memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];34memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];35memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];36memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];37memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];38memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];39}40numTimes &= 15;41for(int i = 0; i < numTimes; ++i)42{43memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];44}45}4647std::vector<int> copySizes;48std::vector<double> results;4950std::vector<int> testCases;5152double totalTimeSecs = 0.0;5354void test_case(int copySize)55{56const int minimumCopyBytes = 1024*1024*64;5758int numTimes = (minimumCopyBytes + copySize-1) / copySize;59if (numTimes < 8) numTimes = 8;6061tick_t bestResult = 1e9;6263#ifndef NUM_TRIALS64#define NUM_TRIALS 565#endif6667for(int i = 0; i < NUM_TRIALS; ++i)68{69double t0 = tick();70test_memset(numTimes, copySize);71double t1 = tick();72if (t1 - t0 < bestResult) bestResult = t1 - t0;73totalTimeSecs += (double)(t1 - t0) / ticks_per_sec();74}75unsigned long long totalBytesTransferred = numTimes * copySize;7677copySizes.push_back(copySize);7879tick_t ticksElapsed = bestResult;80if (ticksElapsed > 0)81{82double seconds = (double)ticksElapsed / ticks_per_sec();83double bytesPerSecond = totalBytesTransferred / seconds;84double mbytesPerSecond = bytesPerSecond / (1024.0*1024.0);85results.push_back(mbytesPerSecond);86}87else88{89results.push_back(0.0);90}91}9293void print_results()94{95std::cout << "Test cases: " << std::endl;96for(size_t i = 0; i < copySizes.size(); ++i)97{98std::cout << copySizes[i];99if (i != copySizes.size()-1) std::cout << ",";100else std::cout << std::endl;101if (i % 10 == 9) std::cout << std::endl;102}103std::cout << std::endl;104std::cout << std::endl;105std::cout << std::endl;106std::cout << "Test results: " << std::endl;107for(size_t i = 0; i < results.size(); ++i)108{109std::cout << results[i];110if (i != results.size()-1) std::cout << ",";111else std::cout << std::endl;112if (i % 10 == 9) std::cout << std::endl;113}114115std::cout << "Result checksum: " << (int)resultCheckSum << std::endl;116std::cout << "Total time: " << totalTimeSecs << std::endl;117}118119int numDone = 0;120121void run_one()122{123std::cout << (numDone+1) << "/" << (numDone+testCases.size()) << std::endl;124++numDone;125126int copySize = testCases.front();127testCases.erase(testCases.begin());128test_case(copySize);129}130131#ifdef __EMSCRIPTEN__132void main_loop()133{134if (!testCases.empty())135{136run_one();137}138else139{140emscripten_cancel_main_loop();141print_results();142}143}144#endif145146#ifndef MAX_COPY147#define MAX_COPY 32*1024*1024148#endif149150#ifndef MIN_COPY151#define MIN_COPY 1152#endif153154int main()155{156for(int copySizeI = MIN_COPY; copySizeI < MAX_COPY; copySizeI <<= 1)157for(int copySizeJ = 1; copySizeJ <= copySizeI; copySizeJ <<= 1)158{159testCases.push_back(copySizeI | copySizeJ);160}161162std::sort(testCases.begin(), testCases.end());163#if defined(__EMSCRIPTEN__) && !defined(BUILD_FOR_SHELL)164emscripten_set_main_loop(main_loop, 0, 0);165#else166while(!testCases.empty()) run_one();167print_results();168#endif169}170171172