Commit 16f12b58 authored by Frank Barchard's avatar Frank Barchard

Replace random with fastrand

random / rand is slow and impacts performance testing.
Although its only called to clear a frame once, a typical profile shows
it high in the overall profile, when doing 1000 frames for a benchmark.

95.10%  libyuv_unittest  libyuv_unittest      [.] YUY2ToARGBRow_SSSE3
 2.01%  libyuv_unittest  libc-2.19.so         [.] __random_r
 1.13%  libyuv_unittest  libc-2.19.so         [.] __random

Replace random is a faster version for unittests.

set LIBYUV_WIDTH=1280
set LIBYUV_HEIGHT=720
set LIBYUV_REPEAT=999
set LIBYUV_FLAGS=-1
out\release\libyuv_unittest --gtest_filter=*YUY2ToARGB*  | findms

Was
libyuvTest.YUY2ToARGB_Opt (497 ms)

Now
libyuvTest.YUY2ToARGB_Opt (454 ms)

R=harryjin@google.com
BUG=none

Review URL: https://codereview.chromium.org/1361813002 .
parent 2b92ec8d
......@@ -66,7 +66,7 @@ TEST_F(libyuvTest, TESTNAME) { \
uint8* p = orig_y; \
for (int y = 0; y < benchmark_height_ - HS1; y += HS) { \
for (int x = 0; x < benchmark_width_ - 1; x += 2) { \
uint8 r = static_cast<uint8>(random()); \
uint8 r = static_cast<uint8>(fastrand()); \
p[0] = r; \
p[1] = r; \
p[HN] = r; \
......@@ -74,7 +74,7 @@ TEST_F(libyuvTest, TESTNAME) { \
p += 2; \
} \
if (benchmark_width_ & 1) { \
uint8 r = static_cast<uint8>(random()); \
uint8 r = static_cast<uint8>(fastrand()); \
p[0] = r; \
p[HN] = r; \
p += 1; \
......
......@@ -45,8 +45,8 @@ TEST_F(libyuvTest, Djb2_Test) {
EXPECT_EQ(kExpectedFoxHash, foxhash);
for (int i = 0; i < kMaxTest; ++i) {
src_a[i] = (random() & 0xff);
src_b[i] = (random() & 0xff);
src_a[i] = (fastrand() & 0xff);
src_b[i] = (fastrand() & 0xff);
}
// Compare different buffers. Expect hash is different.
uint32 h1 = HashDjb2(src_a, kMaxTest, 5381);
......@@ -256,11 +256,9 @@ TEST_F(libyuvTest, SumSquareError) {
EXPECT_EQ(kMaxWidth * 3 * 3, err);
srandom(time(NULL));
for (int i = 0; i < kMaxWidth; ++i) {
src_a[i] = (random() & 0xff);
src_b[i] = (random() & 0xff);
src_a[i] = (fastrand() & 0xff);
src_b[i] = (fastrand() & 0xff);
}
MaskCpuFlags(disable_cpu_flags_);
......@@ -373,15 +371,13 @@ TEST_F(libyuvTest, Psnr) {
EXPECT_LT(err, 6.0);
}
srandom(time(NULL));
memset(src_a, 0, kSrcPlaneSize);
memset(src_b, 0, kSrcPlaneSize);
for (int i = b; i < (kSrcHeight + b); ++i) {
for (int j = b; j < (kSrcWidth + b); ++j) {
src_a[(i * kSrcStride) + j] = (random() & 0xff);
src_b[(i * kSrcStride) + j] = (random() & 0xff);
src_a[(i * kSrcStride) + j] = (fastrand() & 0xff);
src_b[(i * kSrcStride) + j] = (fastrand() & 0xff);
}
}
......@@ -487,11 +483,10 @@ TEST_F(libyuvTest, Ssim) {
EXPECT_LT(err, 0.01);
}
srandom(time(NULL));
for (int i = b; i < (kSrcHeight + b); ++i) {
for (int j = b; j < (kSrcWidth + b); ++j) {
src_a[(i * kSrcStride) + j] = (random() & 0xff);
src_b[(i * kSrcStride) + j] = (random() & 0xff);
src_a[(i * kSrcStride) + j] = (fastrand() & 0xff);
src_b[(i * kSrcStride) + j] = (fastrand() & 0xff);
}
}
......
This diff is collapsed.
......@@ -66,7 +66,6 @@ TEST_F(libyuvTest, TestFixedDiv) {
}
EXPECT_EQ(123 * 65536, libyuv::FixedDiv(123, 1));
srandom(time(NULL));
MemRandomize(reinterpret_cast<uint8*>(&num[0]), sizeof(num));
MemRandomize(reinterpret_cast<uint8*>(&div[0]), sizeof(div));
for (int j = 0; j < 1280; ++j) {
......@@ -92,7 +91,6 @@ TEST_F(libyuvTest, TestFixedDiv_Opt) {
int result_opt[1280];
int result_c[1280];
srandom(time(NULL));
MemRandomize(reinterpret_cast<uint8*>(&num[0]), sizeof(num));
MemRandomize(reinterpret_cast<uint8*>(&div[0]), sizeof(div));
for (int j = 0; j < 1280; ++j) {
......@@ -127,7 +125,6 @@ TEST_F(libyuvTest, TestFixedDiv1_Opt) {
int result_opt[1280];
int result_c[1280];
srandom(time(NULL));
MemRandomize(reinterpret_cast<uint8*>(&num[0]), sizeof(num));
MemRandomize(reinterpret_cast<uint8*>(&div[0]), sizeof(div));
for (int j = 0; j < 1280; ++j) {
......
......@@ -114,9 +114,8 @@ static int TestAttenuateI(int width, int height, int benchmark_iterations,
align_buffer_64(src_argb, kStride * height + off);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb[i + off] = (random() & 0xff);
src_argb[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kStride * height);
memset(dst_argb_opt, 0, kStride * height);
......@@ -180,9 +179,8 @@ static int TestUnattenuateI(int width, int height, int benchmark_iterations,
align_buffer_64(src_argb, kStride * height + off);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb[i + off] = (random() & 0xff);
src_argb[i + off] = (fastrand() & 0xff);
}
ARGBAttenuate(src_argb + off, kStride,
src_argb + off, kStride,
......@@ -936,10 +934,9 @@ TEST_F(libyuvTest, ARGBInterpolate##TERP##N) { \
align_buffer_64(src_argb_b, kStrideA * kHeight + OFF); \
align_buffer_64(dst_argb_c, kStrideB * kHeight); \
align_buffer_64(dst_argb_opt, kStrideB * kHeight); \
srandom(time(NULL)); \
for (int i = 0; i < kStrideA * kHeight; ++i) { \
src_argb_a[i + OFF] = (random() & 0xff); \
src_argb_b[i + OFF] = (random() & 0xff); \
src_argb_a[i + OFF] = (fastrand() & 0xff); \
src_argb_b[i + OFF] = (fastrand() & 0xff); \
} \
MaskCpuFlags(disable_cpu_flags_); \
ARGBInterpolate(src_argb_a + OFF, kStrideA, \
......@@ -998,10 +995,9 @@ static int TestBlend(int width, int height, int benchmark_iterations,
align_buffer_64(src_argb_b, kStride * height + off);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_b[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
src_argb_b[i + off] = (fastrand() & 0xff);
}
ARGBAttenuate(src_argb_a + off, kStride, src_argb_a + off, kStride, width,
height);
......@@ -1304,7 +1300,6 @@ TEST_F(libyuvTest, TestCopyPlane) {
int i, j;
int y_plane_size = (yw + b * 2) * (yh + b * 2);
srandom(time(NULL));
align_buffer_64(orig_y, y_plane_size);
align_buffer_64(dst_c, y_plane_size);
align_buffer_64(dst_opt, y_plane_size);
......@@ -1316,13 +1311,13 @@ TEST_F(libyuvTest, TestCopyPlane) {
// Fill image buffers with random data.
for (i = b; i < (yh + b); ++i) {
for (j = b; j < (yw + b); ++j) {
orig_y[i * (yw + b * 2) + j] = random() & 0xff;
orig_y[i * (yw + b * 2) + j] = fastrand() & 0xff;
}
}
// Fill destination buffers with random data.
for (i = 0; i < y_plane_size; ++i) {
uint8 random_number = random() & 0x7f;
uint8 random_number = fastrand() & 0x7f;
dst_c[i] = random_number;
dst_opt[i] = dst_c[i];
}
......@@ -1371,10 +1366,9 @@ static int TestMultiply(int width, int height, int benchmark_iterations,
align_buffer_64(src_argb_b, kStride * height + off);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_b[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
src_argb_b[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kStride * height);
memset(dst_argb_opt, 0, kStride * height);
......@@ -1442,10 +1436,9 @@ static int TestAdd(int width, int height, int benchmark_iterations,
align_buffer_64(src_argb_b, kStride * height + off);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_b[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
src_argb_b[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kStride * height);
memset(dst_argb_opt, 0, kStride * height);
......@@ -1513,10 +1506,9 @@ static int TestSubtract(int width, int height, int benchmark_iterations,
align_buffer_64(src_argb_b, kStride * height + off);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_b[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
src_argb_b[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kStride * height);
memset(dst_argb_opt, 0, kStride * height);
......@@ -1584,9 +1576,8 @@ static int TestSobel(int width, int height, int benchmark_iterations,
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
memset(src_argb_a, 0, kStride * height + off);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kStride * height);
memset(dst_argb_opt, 0, kStride * height);
......@@ -1653,9 +1644,8 @@ static int TestSobelToPlane(int width, int height, int benchmark_iterations,
align_buffer_64(dst_argb_c, kDstStride * height);
align_buffer_64(dst_argb_opt, kDstStride * height);
memset(src_argb_a, 0, kSrcStride * height + off);
srandom(time(NULL));
for (int i = 0; i < kSrcStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kDstStride * height);
memset(dst_argb_opt, 0, kDstStride * height);
......@@ -1720,9 +1710,8 @@ static int TestSobelXY(int width, int height, int benchmark_iterations,
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
memset(src_argb_a, 0, kStride * height + off);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
}
memset(dst_argb_c, 0, kStride * height);
memset(dst_argb_opt, 0, kStride * height);
......@@ -1787,9 +1776,8 @@ static int TestBlur(int width, int height, int benchmark_iterations,
align_buffer_64(dst_cumsum, width * height * 16);
align_buffer_64(dst_argb_c, kStride * height);
align_buffer_64(dst_argb_opt, kStride * height);
srandom(time(NULL));
for (int i = 0; i < kStride * height; ++i) {
src_argb_a[i + off] = (random() & 0xff);
src_argb_a[i + off] = (fastrand() & 0xff);
}
memset(dst_cumsum, 0, width * height * 16);
memset(dst_argb_c, 0, kStride * height);
......@@ -2105,7 +2093,7 @@ static int TestARGBRect(int width, int height, int benchmark_iterations,
}
const int kStride = width * bpp;
const int kSize = kStride * height;
const uint32 v32 = random() & (bpp == 4 ? 0xffffffff : 0xff);
const uint32 v32 = fastrand() & (bpp == 4 ? 0xffffffff : 0xff);
align_buffer_64(dst_argb_c, kSize + off);
align_buffer_64(dst_argb_opt, kSize + off);
......
......@@ -38,7 +38,7 @@ void TestRotateBpp(int src_width, int src_height,
int src_argb_plane_size = src_stride_argb * abs(src_height);
align_buffer_64(src_argb, src_argb_plane_size);
for (int i = 0; i < src_argb_plane_size; ++i) {
src_argb[i] = random() & 0xff;
src_argb[i] = fastrand() & 0xff;
}
int dst_stride_argb = dst_width * kBpp;
......
......@@ -38,7 +38,7 @@ static void I420TestRotate(int src_width, int src_height,
int src_i420_size = src_i420_y_size + src_i420_uv_size * 2;
align_buffer_64(src_i420, src_i420_size);
for (int i = 0; i < src_i420_size; ++i) {
src_i420[i] = random() & 0xff;
src_i420[i] = fastrand() & 0xff;
}
int dst_i420_y_size = dst_width * dst_height;
......@@ -151,7 +151,7 @@ static void NV12TestRotate(int src_width, int src_height,
int src_nv12_size = src_nv12_y_size + src_nv12_uv_size;
align_buffer_64(src_nv12, src_nv12_size);
for (int i = 0; i < src_nv12_size; ++i) {
src_nv12[i] = random() & 0xff;
src_nv12[i] = fastrand() & 0xff;
}
int dst_i420_y_size = dst_width * dst_height;
......
......@@ -37,7 +37,6 @@ static int ARGBTestFilter(int src_width, int src_height,
printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n");
return 0;
}
srandom(time(NULL));
MemRandomize(src_argb, src_argb_plane_size);
int64 dst_argb_plane_size = (dst_width + b * 2) * (dst_height + b * 2) * 4LL;
......@@ -157,12 +156,10 @@ static int ARGBClipTestFilter(int src_width, int src_height,
int64 dst_argb_plane_size = (dst_width + b * 2) * (dst_height + b * 2) * 4;
int dst_stride_argb = (b * 2 + dst_width) * 4;
srandom(time(NULL));
int i, j;
for (i = b; i < (Abs(src_height) + b); ++i) {
for (j = b; j < (Abs(src_width) + b) * 4; ++j) {
src_argb[(i * src_stride_argb) + j] = (random() & 0xff);
src_argb[(i * src_stride_argb) + j] = (fastrand() & 0xff);
}
}
......
......@@ -66,7 +66,7 @@ TEST_F(libyuvTest, TESTNAME) { \
uint8* p = orig_y; \
for (int y = 0; y < benchmark_height_ - HS1; y += HS) { \
for (int x = 0; x < benchmark_width_ - 1; x += 2) { \
uint8 r = static_cast<uint8>(random()); \
uint8 r = static_cast<uint8>(fastrand()); \
p[0] = r; \
p[1] = r; \
p[HN] = r; \
......@@ -74,7 +74,7 @@ TEST_F(libyuvTest, TESTNAME) { \
p += 2; \
} \
if (benchmark_width_ & 1) { \
uint8 r = static_cast<uint8>(random()); \
uint8 r = static_cast<uint8>(fastrand()); \
p[0] = r; \
p[HN] = r; \
p += 1; \
......
......@@ -43,7 +43,6 @@ static int TestFilter(int src_width, int src_height,
printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n");
return 0;
}
srandom(time(NULL));
MemRandomize(src_y, src_y_plane_size);
MemRandomize(src_u, src_uv_plane_size);
MemRandomize(src_v, src_uv_plane_size);
......@@ -171,7 +170,6 @@ static int TestFilter_16(int src_width, int src_height,
uint16* p_src_u_16 = reinterpret_cast<uint16*>(src_u_16);
uint16* p_src_v_16 = reinterpret_cast<uint16*>(src_v_16);
srandom(time(NULL));
MemRandomize(src_y, src_y_plane_size);
MemRandomize(src_u, src_uv_plane_size);
MemRandomize(src_v, src_uv_plane_size);
......
......@@ -18,6 +18,8 @@
// TODO(fbarchard): Add command line parsing to pass this as option.
#define BENCHMARK_ITERATIONS 1
int fastrand_seed = 0xfb;
libyuvTest::libyuvTest() : rotate_max_w_(128), rotate_max_h_(128),
benchmark_iterations_(BENCHMARK_ITERATIONS), benchmark_width_(128),
benchmark_height_(72), disable_cpu_flags_(0) {
......
......@@ -46,9 +46,6 @@ static inline double get_time() {
QueryPerformanceFrequency(&f);
return static_cast<double>(t.QuadPart) / static_cast<double>(f.QuadPart);
}
#define random rand
#define srandom srand
#else
static inline double get_time() {
struct timeval t;
......@@ -58,14 +55,20 @@ static inline double get_time() {
}
#endif
extern int fastrand_seed;
inline int fastrand() {
fastrand_seed = fastrand_seed * 214013 + 2531011;
return (fastrand_seed >> 16) & 0xffff;
}
static inline void MemRandomize(uint8* dst, int64 len) {
int64 i;
for (i = 0; i < len - 1; i += 2) {
*reinterpret_cast<uint16*>(dst) = random();
*reinterpret_cast<uint16*>(dst) = fastrand();
dst += 2;
}
for (; i < len; ++i) {
*dst++ = random();
*dst++ = fastrand();
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment