Benchmark to find the faster method to retrieve data by reference parameter or returning a reference
The example code is hosted at Github.
Introduction
In C++, there are two options to retrieve data from a object: either passing a reference parameter to be filled up or returning a reference. The former is making a copy of data (which may be what the developer wants) while the latter is returning a memory address of the data.
void PassByReference(std::vector<int>& vec)
{
vec = m_vec; }
std::vector<int>& ReturnReference()
{
return m_vec; }
Since reference in C++ is a syntactic sugar for pointer, the pointer equivalent of the two above functions are presented below. By right, they should have the same performance characteristic.
void PassByPointer(std::vector<int>* vec)
{
*vec = m_vec; }
std::vector<int>* ReturnPointer()
{
return &m_vec; }
Benchmark Code
The code used for benchmark is below:
const int MAX_LOOP = 100000;
timer stopwatch;
{
stopwatch.start("PassByReference");
Foo foo;
std::vector<int> vec;
for (int i = 0; i < MAX_LOOP; ++i)
{
foo.Add(i);
foo.PassByReference(vec);
}
stopwatch.stop();
}
{
stopwatch.start("ReturnReference");
Foo foo;
std::vector<int>* p = nullptr;
for (int i = 0; i < MAX_LOOP; ++i)
{
foo.Add(i);
p = &foo.ReturnReference();
}
stopwatch.stop();
}
{
stopwatch.start("PassByPointer");
Foo foo;
std::vector<int> vec;
for (int i = 0; i < MAX_LOOP; ++i)
{
foo.Add(i);
foo.PassByPointer(&vec);
}
stopwatch.stop();
}
{
stopwatch.start("ReturnPointer");
Foo foo;
std::vector<int>* p = nullptr;
for (int i = 0; i < MAX_LOOP; ++i)
{
foo.Add(i);
p = foo.ReturnPointer();
}
stopwatch.stop();
}
Benchmark Results
The benchmark results for different C++ compilers are presented below:
Visual C++ 2019 16.7 Update on Windows 10 20.04 Update
PassByReference timing: 565ms
ReturnReference timing: 0ms
PassByPointer timing: 572ms
ReturnPointer timing: 0ms
G++ 9.3.0 Ubuntu 20.04 WSL2
G++ build command is as follows:
g++ -std=c++11 -O3 TestReference.cpp
PassByReference timing: 8945ms
ReturnReference timing: 0ms
PassByPointer timing: 598ms
ReturnPointer timing: 1ms
Clang++ 10.0.0 Ubuntu 20.04 WSL2
Clang++ build command is as follows:
clang++ -std=c++11 -O3 TestReference.cpp
PassByReference timing: 8824ms
ReturnReference timing: 0ms
PassByPointer timing: 617ms
ReturnPointer timing: 0ms
History
- 20th September, 2020: Initial version