Skip to content

Commit 031d0aa

Browse files
author
Henry Qin
committed
Add stddev and a small test case for Stats
1 parent 55de4a4 commit 031d0aa

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ $(OBJECT_DIR)/cycles_wrapper_test: $(OBJECT_DIR)/cycles_wrapper_test.o $(OBJECT_
4141
$(CC) $(CFLAGS) -lstdc++ -o $@ $^
4242

4343
$(OBJECT_DIR)/perf_wrapper_test: $(OBJECT_DIR)/perf_wrapper_test.o $(OBJECT_DIR)/libPerfUtils.a
44-
$(CC) $(CFLAGS) -lstdc++ -o $@ $^
44+
$(CC) $(CFLAGS) -lstdc++ -o $@ $^ -lm
4545

4646
-include $(DEP)
4747

@@ -76,9 +76,10 @@ GMOCK_DIR=../googletest/googlemock
7676
TEST_LIBS=-Lobj/ -lPerfUtils $(OBJECT_DIR)/libgtest.a $(OBJECT_DIR)/libgmock.a
7777
INCLUDE+=-I${GTEST_DIR}/include -I${GMOCK_DIR}/include
7878

79-
test: $(OBJECT_DIR)/UtilTest $(OBJECT_DIR)/PerfTest
79+
test: $(OBJECT_DIR)/UtilTest $(OBJECT_DIR)/PerfTest $(OBJECT_DIR)/StatsTest
8080
$(OBJECT_DIR)/UtilTest
8181
$(OBJECT_DIR)/PerfTest
82+
$(OBJECT_DIR)/StatsTest
8283

8384
$(OBJECT_DIR)/UtilTest: $(OBJECT_DIR)/UtilTest.o $(OBJECT_DIR)/libgtest.a $(OBJECT_DIR)/libgmock.a \
8485
$(OBJECT_DIR)/libPerfUtils.a
@@ -88,6 +89,10 @@ $(OBJECT_DIR)/PerfTest: $(OBJECT_DIR)/PerfTest.o $(OBJECT_DIR)/libgtest.a $(OBJ
8889
$(OBJECT_DIR)/libPerfUtils.a
8990
$(CXX) $(INCLUDE) $(CXXFLAGS) $< $(GTEST_DIR)/src/gtest_main.cc $(TEST_LIBS) $(LIBS) -o $@
9091

92+
$(OBJECT_DIR)/StatsTest: $(OBJECT_DIR)/StatsTest.o $(OBJECT_DIR)/libgtest.a $(OBJECT_DIR)/libgmock.a \
93+
$(OBJECT_DIR)/libPerfUtils.a
94+
$(CXX) $(INCLUDE) $(CXXFLAGS) $< $(GTEST_DIR)/src/gtest_main.cc $(TEST_LIBS) $(LIBS) -o $@
95+
9196
$(OBJECT_DIR)/libgtest.a:
9297
$(CXX) -I${GTEST_DIR}/include -I${GTEST_DIR} \
9398
-pthread -c ${GTEST_DIR}/src/gtest-all.cc \

src/Stats.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ computeStatistics(uint64_t* rawdata, size_t count) {
3939
sum += rawdata[i];
4040
stats.count = count;
4141
stats.average = sum / count;
42+
stats.stddev = 0;
43+
for (size_t i = 0; i < count; i++) {
44+
uint64_t diff = rawdata[i] > stats.average ? rawdata[i] - stats.average
45+
: stats.average - rawdata[i];
46+
stats.stddev += diff * diff;
47+
}
48+
stats.stddev /= count;
49+
stats.stddev = static_cast<uint64_t>(sqrt(stats.stddev));
4250
stats.min = rawdata[0];
4351
stats.median = rawdata[count / 2];
4452
stats.P10 = rawdata[static_cast<int>(static_cast<double>(count) * 0.1)];

src/StatsMinimal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
struct Statistics {
2626
size_t count;
2727
uint64_t average;
28+
uint64_t stddev;
2829
uint64_t min;
2930
uint64_t median;
3031
uint64_t P10;

src/StatsTest.cc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* Copyright (c) 2014-2017 Stanford University
2+
*
3+
* Permission to use, copy, modify, and distribute this software for any purpose
4+
* with or without fee is hereby granted, provided that the above copyright
5+
* notice and this permission notice appear in all copies.
6+
*
7+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR(S) DISCLAIM ALL WARRANTIES
8+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL AUTHORS BE LIABLE FOR ANY
10+
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
11+
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
12+
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13+
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14+
*/
15+
16+
#include "Stats.h"
17+
18+
#include <fcntl.h>
19+
#include <string.h>
20+
#include <sys/stat.h>
21+
#include <sys/types.h>
22+
23+
#include "gmock/gmock.h"
24+
#include "gtest/gtest.h"
25+
26+
27+
TEST(StatsTest, allStats) {
28+
const int numElements = 100;
29+
uint64_t input[numElements];
30+
for (uint64_t i = 0; i < numElements; i++)
31+
input[i] = i;
32+
Statistics stats = computeStatistics(input, numElements);
33+
EXPECT_EQ(numElements, stats.count);
34+
EXPECT_EQ(0, stats.min);
35+
EXPECT_EQ(99, stats.max);
36+
EXPECT_EQ(50, stats.median);
37+
EXPECT_EQ(49, stats.average);
38+
EXPECT_EQ(28, stats.stddev);
39+
}

0 commit comments

Comments
 (0)