snappy 0.0.17 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +5 -5
  2. data/.dockerignore +2 -0
  3. data/.github/workflows/main.yml +34 -0
  4. data/.github/workflows/publish.yml +34 -0
  5. data/.gitignore +2 -1
  6. data/.gitmodules +1 -1
  7. data/Dockerfile +13 -0
  8. data/Gemfile +4 -0
  9. data/README.md +29 -5
  10. data/Rakefile +32 -29
  11. data/ext/api.c +6 -1
  12. data/ext/extconf.rb +23 -16
  13. data/lib/snappy/hadoop/reader.rb +62 -0
  14. data/lib/snappy/hadoop/writer.rb +51 -0
  15. data/lib/snappy/hadoop.rb +22 -0
  16. data/lib/snappy/reader.rb +14 -10
  17. data/lib/snappy/shim.rb +1 -1
  18. data/lib/snappy/version.rb +1 -1
  19. data/lib/snappy.rb +5 -4
  20. data/snappy.gemspec +13 -13
  21. data/test/hadoop/snappy_hadoop_reader_test.rb +115 -0
  22. data/test/hadoop/snappy_hadoop_writer_test.rb +48 -0
  23. data/test/snappy_hadoop_test.rb +26 -0
  24. data/test/snappy_reader_test.rb +148 -0
  25. data/test/snappy_test.rb +95 -0
  26. data/test/snappy_writer_test.rb +55 -0
  27. data/test/test_helper.rb +7 -0
  28. data/test.sh +3 -0
  29. data/vendor/snappy/CMakeLists.txt +297 -0
  30. data/vendor/snappy/CONTRIBUTING.md +26 -0
  31. data/vendor/snappy/NEWS +40 -0
  32. data/vendor/snappy/{README → README.md} +27 -18
  33. data/vendor/snappy/cmake/SnappyConfig.cmake.in +33 -0
  34. data/vendor/snappy/cmake/config.h.in +62 -0
  35. data/vendor/snappy/docs/README.md +72 -0
  36. data/vendor/snappy/snappy-internal.h +22 -18
  37. data/vendor/snappy/snappy-stubs-internal.cc +1 -1
  38. data/vendor/snappy/snappy-stubs-internal.h +116 -38
  39. data/vendor/snappy/snappy-stubs-public.h.in +20 -46
  40. data/vendor/snappy/snappy-test.cc +26 -22
  41. data/vendor/snappy/snappy-test.h +24 -98
  42. data/vendor/snappy/snappy.cc +380 -183
  43. data/vendor/snappy/snappy.h +14 -10
  44. data/vendor/snappy/snappy_compress_fuzzer.cc +59 -0
  45. data/vendor/snappy/snappy_uncompress_fuzzer.cc +57 -0
  46. data/vendor/snappy/snappy_unittest.cc +236 -261
  47. metadata +37 -92
  48. data/.travis.yml +0 -26
  49. data/smoke.sh +0 -8
  50. data/test/test-snappy-reader.rb +0 -129
  51. data/test/test-snappy-writer.rb +0 -55
  52. data/test/test-snappy.rb +0 -58
  53. data/vendor/snappy/ChangeLog +0 -2468
  54. data/vendor/snappy/INSTALL +0 -370
  55. data/vendor/snappy/Makefile +0 -982
  56. data/vendor/snappy/Makefile.am +0 -26
  57. data/vendor/snappy/Makefile.in +0 -982
  58. data/vendor/snappy/aclocal.m4 +0 -9738
  59. data/vendor/snappy/autogen.sh +0 -12
  60. data/vendor/snappy/autom4te.cache/output.0 +0 -18856
  61. data/vendor/snappy/autom4te.cache/output.1 +0 -18852
  62. data/vendor/snappy/autom4te.cache/requests +0 -297
  63. data/vendor/snappy/autom4te.cache/traces.0 +0 -2689
  64. data/vendor/snappy/autom4te.cache/traces.1 +0 -714
  65. data/vendor/snappy/config.guess +0 -1530
  66. data/vendor/snappy/config.h +0 -135
  67. data/vendor/snappy/config.h.in +0 -134
  68. data/vendor/snappy/config.log +0 -1640
  69. data/vendor/snappy/config.status +0 -2318
  70. data/vendor/snappy/config.sub +0 -1773
  71. data/vendor/snappy/configure +0 -18852
  72. data/vendor/snappy/configure.ac +0 -134
  73. data/vendor/snappy/depcomp +0 -688
  74. data/vendor/snappy/install-sh +0 -527
  75. data/vendor/snappy/libtool +0 -10246
  76. data/vendor/snappy/ltmain.sh +0 -9661
  77. data/vendor/snappy/m4/gtest.m4 +0 -74
  78. data/vendor/snappy/m4/libtool.m4 +0 -8001
  79. data/vendor/snappy/m4/ltoptions.m4 +0 -384
  80. data/vendor/snappy/m4/ltsugar.m4 +0 -123
  81. data/vendor/snappy/m4/ltversion.m4 +0 -23
  82. data/vendor/snappy/m4/lt~obsolete.m4 +0 -98
  83. data/vendor/snappy/missing +0 -331
  84. data/vendor/snappy/snappy-stubs-public.h +0 -100
  85. data/vendor/snappy/snappy.pc +0 -10
  86. data/vendor/snappy/snappy.pc.in +0 -10
  87. data/vendor/snappy/stamp-h1 +0 -1
@@ -29,9 +29,10 @@
29
29
  #include <math.h>
30
30
  #include <stdlib.h>
31
31
 
32
-
33
32
  #include <algorithm>
33
+ #include <random>
34
34
  #include <string>
35
+ #include <utility>
35
36
  #include <vector>
36
37
 
37
38
  #include "snappy.h"
@@ -50,13 +51,6 @@ DEFINE_bool(zlib, false,
50
51
  "Run zlib compression (http://www.zlib.net)");
51
52
  DEFINE_bool(lzo, false,
52
53
  "Run LZO compression (http://www.oberhumer.com/opensource/lzo/)");
53
- DEFINE_bool(quicklz, false,
54
- "Run quickLZ compression (http://www.quicklz.com/)");
55
- DEFINE_bool(liblzf, false,
56
- "Run libLZF compression "
57
- "(http://www.goof.com/pcg/marc/liblzf.html)");
58
- DEFINE_bool(fastlz, false,
59
- "Run FastLZ compression (http://www.fastlz.org/");
60
54
  DEFINE_bool(snappy, true, "Run snappy compression");
61
55
 
62
56
  DEFINE_bool(write_compressed, false,
@@ -69,8 +63,7 @@ DEFINE_bool(snappy_dump_decompression_table, false,
69
63
 
70
64
  namespace snappy {
71
65
 
72
-
73
- #ifdef HAVE_FUNC_MMAP
66
+ #if defined(HAVE_FUNC_MMAP) && defined(HAVE_FUNC_SYSCONF)
74
67
 
75
68
  // To test against code that reads beyond its input, this class copies a
76
69
  // string to a newly allocated group of pages, the last of which
@@ -80,8 +73,8 @@ namespace snappy {
80
73
  // be able to read previously allocated memory while doing heap allocations.
81
74
  class DataEndingAtUnreadablePage {
82
75
  public:
83
- explicit DataEndingAtUnreadablePage(const string& s) {
84
- const size_t page_size = getpagesize();
76
+ explicit DataEndingAtUnreadablePage(const std::string& s) {
77
+ const size_t page_size = sysconf(_SC_PAGESIZE);
85
78
  const size_t size = s.size();
86
79
  // Round up space for string to a multiple of page_size.
87
80
  size_t space_for_string = (size + page_size - 1) & ~(page_size - 1);
@@ -99,8 +92,9 @@ class DataEndingAtUnreadablePage {
99
92
  }
100
93
 
101
94
  ~DataEndingAtUnreadablePage() {
95
+ const size_t page_size = sysconf(_SC_PAGESIZE);
102
96
  // Undo the mprotect.
103
- CHECK_EQ(0, mprotect(protected_page_, getpagesize(), PROT_READ|PROT_WRITE));
97
+ CHECK_EQ(0, mprotect(protected_page_, page_size, PROT_READ|PROT_WRITE));
104
98
  CHECK_EQ(0, munmap(mem_, alloc_size_));
105
99
  }
106
100
 
@@ -115,19 +109,19 @@ class DataEndingAtUnreadablePage {
115
109
  size_t size_;
116
110
  };
117
111
 
118
- #else // HAVE_FUNC_MMAP
112
+ #else // defined(HAVE_FUNC_MMAP) && defined(HAVE_FUNC_SYSCONF)
119
113
 
120
114
  // Fallback for systems without mmap.
121
- typedef string DataEndingAtUnreadablePage;
115
+ using DataEndingAtUnreadablePage = std::string;
122
116
 
123
117
  #endif
124
118
 
125
119
  enum CompressorType {
126
- ZLIB, LZO, LIBLZF, QUICKLZ, FASTLZ, SNAPPY
120
+ ZLIB, LZO, SNAPPY
127
121
  };
128
122
 
129
123
  const char* names[] = {
130
- "ZLIB", "LZO", "LIBLZF", "QUICKLZ", "FASTLZ", "SNAPPY"
124
+ "ZLIB", "LZO", "SNAPPY"
131
125
  };
132
126
 
133
127
  static size_t MinimumRequiredOutputSpace(size_t input_size,
@@ -143,21 +137,6 @@ static size_t MinimumRequiredOutputSpace(size_t input_size,
143
137
  return input_size + input_size/64 + 16 + 3;
144
138
  #endif // LZO_VERSION
145
139
 
146
- #ifdef LZF_VERSION
147
- case LIBLZF:
148
- return input_size;
149
- #endif // LZF_VERSION
150
-
151
- #ifdef QLZ_VERSION_MAJOR
152
- case QUICKLZ:
153
- return input_size + 36000; // 36000 is used for scratch.
154
- #endif // QLZ_VERSION_MAJOR
155
-
156
- #ifdef FASTLZ_VERSION
157
- case FASTLZ:
158
- return max(static_cast<int>(ceil(input_size * 1.05)), 66);
159
- #endif // FASTLZ_VERSION
160
-
161
140
  case SNAPPY:
162
141
  return snappy::MaxCompressedLength(input_size);
163
142
 
@@ -175,7 +154,7 @@ static size_t MinimumRequiredOutputSpace(size_t input_size,
175
154
  // "compressed" must be preinitialized to at least MinCompressbufSize(comp)
176
155
  // number of bytes, and may contain junk bytes at the end after return.
177
156
  static bool Compress(const char* input, size_t input_size, CompressorType comp,
178
- string* compressed, bool compressed_is_preallocated) {
157
+ std::string* compressed, bool compressed_is_preallocated) {
179
158
  if (!compressed_is_preallocated) {
180
159
  compressed->resize(MinimumRequiredOutputSpace(input_size, comp));
181
160
  }
@@ -217,58 +196,6 @@ static bool Compress(const char* input, size_t input_size, CompressorType comp,
217
196
  }
218
197
  #endif // LZO_VERSION
219
198
 
220
- #ifdef LZF_VERSION
221
- case LIBLZF: {
222
- int destlen = lzf_compress(input,
223
- input_size,
224
- string_as_array(compressed),
225
- input_size);
226
- if (destlen == 0) {
227
- // lzf *can* cause lots of blowup when compressing, so they
228
- // recommend to limit outsize to insize, and just not compress
229
- // if it's bigger. Ideally, we'd just swap input and output.
230
- compressed->assign(input, input_size);
231
- destlen = input_size;
232
- }
233
- if (!compressed_is_preallocated) {
234
- compressed->resize(destlen);
235
- }
236
- break;
237
- }
238
- #endif // LZF_VERSION
239
-
240
- #ifdef QLZ_VERSION_MAJOR
241
- case QUICKLZ: {
242
- qlz_state_compress *state_compress = new qlz_state_compress;
243
- int destlen = qlz_compress(input,
244
- string_as_array(compressed),
245
- input_size,
246
- state_compress);
247
- delete state_compress;
248
- CHECK_NE(0, destlen);
249
- if (!compressed_is_preallocated) {
250
- compressed->resize(destlen);
251
- }
252
- break;
253
- }
254
- #endif // QLZ_VERSION_MAJOR
255
-
256
- #ifdef FASTLZ_VERSION
257
- case FASTLZ: {
258
- // Use level 1 compression since we mostly care about speed.
259
- int destlen = fastlz_compress_level(
260
- 1,
261
- input,
262
- input_size,
263
- string_as_array(compressed));
264
- if (!compressed_is_preallocated) {
265
- compressed->resize(destlen);
266
- }
267
- CHECK_NE(destlen, 0);
268
- break;
269
- }
270
- #endif // FASTLZ_VERSION
271
-
272
199
  case SNAPPY: {
273
200
  size_t destlen;
274
201
  snappy::RawCompress(input, input_size,
@@ -288,8 +215,8 @@ static bool Compress(const char* input, size_t input_size, CompressorType comp,
288
215
  return true;
289
216
  }
290
217
 
291
- static bool Uncompress(const string& compressed, CompressorType comp,
292
- int size, string* output) {
218
+ static bool Uncompress(const std::string& compressed, CompressorType comp,
219
+ int size, std::string* output) {
293
220
  switch (comp) {
294
221
  #ifdef ZLIB_VERSION
295
222
  case ZLIB: {
@@ -323,49 +250,6 @@ static bool Uncompress(const string& compressed, CompressorType comp,
323
250
  }
324
251
  #endif // LZO_VERSION
325
252
 
326
- #ifdef LZF_VERSION
327
- case LIBLZF: {
328
- output->resize(size);
329
- int destlen = lzf_decompress(compressed.data(),
330
- compressed.size(),
331
- string_as_array(output),
332
- output->size());
333
- if (destlen == 0) {
334
- // This error probably means we had decided not to compress,
335
- // and thus have stored input in output directly.
336
- output->assign(compressed.data(), compressed.size());
337
- destlen = compressed.size();
338
- }
339
- CHECK_EQ(destlen, size);
340
- break;
341
- }
342
- #endif // LZF_VERSION
343
-
344
- #ifdef QLZ_VERSION_MAJOR
345
- case QUICKLZ: {
346
- output->resize(size);
347
- qlz_state_decompress *state_decompress = new qlz_state_decompress;
348
- int destlen = qlz_decompress(compressed.data(),
349
- string_as_array(output),
350
- state_decompress);
351
- delete state_decompress;
352
- CHECK_EQ(destlen, size);
353
- break;
354
- }
355
- #endif // QLZ_VERSION_MAJOR
356
-
357
- #ifdef FASTLZ_VERSION
358
- case FASTLZ: {
359
- output->resize(size);
360
- int destlen = fastlz_decompress(compressed.data(),
361
- compressed.length(),
362
- string_as_array(output),
363
- size);
364
- CHECK_EQ(destlen, size);
365
- break;
366
- }
367
- #endif // FASTLZ_VERSION
368
-
369
253
  case SNAPPY: {
370
254
  snappy::RawUncompress(compressed.data(), compressed.size(),
371
255
  string_as_array(output));
@@ -395,11 +279,11 @@ static void Measure(const char* data,
395
279
  int num_blocks = (length + block_size - 1) / block_size;
396
280
  std::vector<const char*> input(num_blocks);
397
281
  std::vector<size_t> input_length(num_blocks);
398
- std::vector<string> compressed(num_blocks);
399
- std::vector<string> output(num_blocks);
282
+ std::vector<std::string> compressed(num_blocks);
283
+ std::vector<std::string> output(num_blocks);
400
284
  for (int b = 0; b < num_blocks; b++) {
401
285
  int input_start = b * block_size;
402
- int input_limit = min<int>((b+1)*block_size, length);
286
+ int input_limit = std::min<int>((b+1)*block_size, length);
403
287
  input[b] = data+input_start;
404
288
  input_length[b] = input_limit-input_start;
405
289
 
@@ -454,29 +338,28 @@ static void Measure(const char* data,
454
338
  }
455
339
  }
456
340
 
457
- sort(ctime, ctime + kRuns);
458
- sort(utime, utime + kRuns);
341
+ std::sort(ctime, ctime + kRuns);
342
+ std::sort(utime, utime + kRuns);
459
343
  const int med = kRuns/2;
460
344
 
461
345
  float comp_rate = (length / ctime[med]) * repeats / 1048576.0;
462
346
  float uncomp_rate = (length / utime[med]) * repeats / 1048576.0;
463
- string x = names[comp];
347
+ std::string x = names[comp];
464
348
  x += ":";
465
- string urate = (uncomp_rate >= 0)
466
- ? StringPrintf("%.1f", uncomp_rate)
467
- : string("?");
349
+ std::string urate = (uncomp_rate >= 0) ? StrFormat("%.1f", uncomp_rate)
350
+ : std::string("?");
468
351
  printf("%-7s [b %dM] bytes %6d -> %6d %4.1f%% "
469
352
  "comp %5.1f MB/s uncomp %5s MB/s\n",
470
353
  x.c_str(),
471
354
  block_size/(1<<20),
472
355
  static_cast<int>(length), static_cast<uint32>(compressed_size),
473
- (compressed_size * 100.0) / max<int>(1, length),
356
+ (compressed_size * 100.0) / std::max<int>(1, length),
474
357
  comp_rate,
475
358
  urate.c_str());
476
359
  }
477
360
 
478
- static int VerifyString(const string& input) {
479
- string compressed;
361
+ static int VerifyString(const std::string& input) {
362
+ std::string compressed;
480
363
  DataEndingAtUnreadablePage i(input);
481
364
  const size_t written = snappy::Compress(i.data(), i.size(), &compressed);
482
365
  CHECK_EQ(written, compressed.size());
@@ -484,15 +367,15 @@ static int VerifyString(const string& input) {
484
367
  snappy::MaxCompressedLength(input.size()));
485
368
  CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size()));
486
369
 
487
- string uncompressed;
370
+ std::string uncompressed;
488
371
  DataEndingAtUnreadablePage c(compressed);
489
372
  CHECK(snappy::Uncompress(c.data(), c.size(), &uncompressed));
490
373
  CHECK_EQ(uncompressed, input);
491
374
  return uncompressed.size();
492
375
  }
493
376
 
494
- static void VerifyStringSink(const string& input) {
495
- string compressed;
377
+ static void VerifyStringSink(const std::string& input) {
378
+ std::string compressed;
496
379
  DataEndingAtUnreadablePage i(input);
497
380
  const size_t written = snappy::Compress(i.data(), i.size(), &compressed);
498
381
  CHECK_EQ(written, compressed.size());
@@ -500,7 +383,7 @@ static void VerifyStringSink(const string& input) {
500
383
  snappy::MaxCompressedLength(input.size()));
501
384
  CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size()));
502
385
 
503
- string uncompressed;
386
+ std::string uncompressed;
504
387
  uncompressed.resize(input.size());
505
388
  snappy::UncheckedByteArraySink sink(string_as_array(&uncompressed));
506
389
  DataEndingAtUnreadablePage c(compressed);
@@ -509,8 +392,8 @@ static void VerifyStringSink(const string& input) {
509
392
  CHECK_EQ(uncompressed, input);
510
393
  }
511
394
 
512
- static void VerifyIOVec(const string& input) {
513
- string compressed;
395
+ static void VerifyIOVec(const std::string& input) {
396
+ std::string compressed;
514
397
  DataEndingAtUnreadablePage i(input);
515
398
  const size_t written = snappy::Compress(i.data(), i.size(), &compressed);
516
399
  CHECK_EQ(written, compressed.size());
@@ -521,23 +404,28 @@ static void VerifyIOVec(const string& input) {
521
404
  // Try uncompressing into an iovec containing a random number of entries
522
405
  // ranging from 1 to 10.
523
406
  char* buf = new char[input.size()];
524
- ACMRandom rnd(input.size());
525
- size_t num = rnd.Next() % 10 + 1;
407
+ std::minstd_rand0 rng(input.size());
408
+ std::uniform_int_distribution<size_t> uniform_1_to_10(1, 10);
409
+ size_t num = uniform_1_to_10(rng);
526
410
  if (input.size() < num) {
527
411
  num = input.size();
528
412
  }
529
413
  struct iovec* iov = new iovec[num];
530
414
  int used_so_far = 0;
415
+ std::bernoulli_distribution one_in_five(1.0 / 5);
531
416
  for (size_t i = 0; i < num; ++i) {
417
+ assert(used_so_far < input.size());
532
418
  iov[i].iov_base = buf + used_so_far;
533
419
  if (i == num - 1) {
534
420
  iov[i].iov_len = input.size() - used_so_far;
535
421
  } else {
536
422
  // Randomly choose to insert a 0 byte entry.
537
- if (rnd.OneIn(5)) {
423
+ if (one_in_five(rng)) {
538
424
  iov[i].iov_len = 0;
539
425
  } else {
540
- iov[i].iov_len = rnd.Uniform(input.size());
426
+ std::uniform_int_distribution<size_t> uniform_not_used_so_far(
427
+ 0, input.size() - used_so_far - 1);
428
+ iov[i].iov_len = uniform_not_used_so_far(rng);
541
429
  }
542
430
  }
543
431
  used_so_far += iov[i].iov_len;
@@ -551,22 +439,22 @@ static void VerifyIOVec(const string& input) {
551
439
 
552
440
  // Test that data compressed by a compressor that does not
553
441
  // obey block sizes is uncompressed properly.
554
- static void VerifyNonBlockedCompression(const string& input) {
442
+ static void VerifyNonBlockedCompression(const std::string& input) {
555
443
  if (input.length() > snappy::kBlockSize) {
556
444
  // We cannot test larger blocks than the maximum block size, obviously.
557
445
  return;
558
446
  }
559
447
 
560
- string prefix;
448
+ std::string prefix;
561
449
  Varint::Append32(&prefix, input.size());
562
450
 
563
451
  // Setup compression table
564
- snappy::internal::WorkingMemory wmem;
452
+ snappy::internal::WorkingMemory wmem(input.size());
565
453
  int table_size;
566
454
  uint16* table = wmem.GetHashTable(input.size(), &table_size);
567
455
 
568
456
  // Compress entire input in one shot
569
- string compressed;
457
+ std::string compressed;
570
458
  compressed += prefix;
571
459
  compressed.resize(prefix.size()+snappy::MaxCompressedLength(input.size()));
572
460
  char* dest = string_as_array(&compressed) + prefix.size();
@@ -574,13 +462,13 @@ static void VerifyNonBlockedCompression(const string& input) {
574
462
  dest, table, table_size);
575
463
  compressed.resize(end - compressed.data());
576
464
 
577
- // Uncompress into string
578
- string uncomp_str;
465
+ // Uncompress into std::string
466
+ std::string uncomp_str;
579
467
  CHECK(snappy::Uncompress(compressed.data(), compressed.size(), &uncomp_str));
580
468
  CHECK_EQ(uncomp_str, input);
581
469
 
582
470
  // Uncompress using source/sink
583
- string uncomp_str2;
471
+ std::string uncomp_str2;
584
472
  uncomp_str2.resize(input.size());
585
473
  snappy::UncheckedByteArraySink sink(string_as_array(&uncomp_str2));
586
474
  snappy::ByteArraySource source(compressed.data(), compressed.size());
@@ -592,28 +480,28 @@ static void VerifyNonBlockedCompression(const string& input) {
592
480
  static const int kNumBlocks = 10;
593
481
  struct iovec vec[kNumBlocks];
594
482
  const int block_size = 1 + input.size() / kNumBlocks;
595
- string iovec_data(block_size * kNumBlocks, 'x');
483
+ std::string iovec_data(block_size * kNumBlocks, 'x');
596
484
  for (int i = 0; i < kNumBlocks; i++) {
597
485
  vec[i].iov_base = string_as_array(&iovec_data) + i * block_size;
598
486
  vec[i].iov_len = block_size;
599
487
  }
600
488
  CHECK(snappy::RawUncompressToIOVec(compressed.data(), compressed.size(),
601
489
  vec, kNumBlocks));
602
- CHECK_EQ(string(iovec_data.data(), input.size()), input);
490
+ CHECK_EQ(std::string(iovec_data.data(), input.size()), input);
603
491
  }
604
492
  }
605
493
 
606
494
  // Expand the input so that it is at least K times as big as block size
607
- static string Expand(const string& input) {
495
+ static std::string Expand(const std::string& input) {
608
496
  static const int K = 3;
609
- string data = input;
497
+ std::string data = input;
610
498
  while (data.size() < K * snappy::kBlockSize) {
611
499
  data += input;
612
500
  }
613
501
  return data;
614
502
  }
615
503
 
616
- static int Verify(const string& input) {
504
+ static int Verify(const std::string& input) {
617
505
  VLOG(1) << "Verifying input of size " << input.size();
618
506
 
619
507
  // Compress using string based routines
@@ -625,7 +513,7 @@ static int Verify(const string& input) {
625
513
  VerifyNonBlockedCompression(input);
626
514
  VerifyIOVec(input);
627
515
  if (!input.empty()) {
628
- const string expanded = Expand(input);
516
+ const std::string expanded = Expand(input);
629
517
  VerifyNonBlockedCompression(expanded);
630
518
  VerifyIOVec(input);
631
519
  }
@@ -633,21 +521,20 @@ static int Verify(const string& input) {
633
521
  return result;
634
522
  }
635
523
 
636
-
637
- static bool IsValidCompressedBuffer(const string& c) {
524
+ static bool IsValidCompressedBuffer(const std::string& c) {
638
525
  return snappy::IsValidCompressedBuffer(c.data(), c.size());
639
526
  }
640
- static bool Uncompress(const string& c, string* u) {
527
+ static bool Uncompress(const std::string& c, std::string* u) {
641
528
  return snappy::Uncompress(c.data(), c.size(), u);
642
529
  }
643
530
 
644
531
  // This test checks to ensure that snappy doesn't coredump if it gets
645
532
  // corrupted data.
646
533
  TEST(CorruptedTest, VerifyCorrupted) {
647
- string source = "making sure we don't crash with corrupted input";
534
+ std::string source = "making sure we don't crash with corrupted input";
648
535
  VLOG(1) << source;
649
- string dest;
650
- string uncmp;
536
+ std::string dest;
537
+ std::string uncmp;
651
538
  snappy::Compress(source.data(), source.size(), &dest);
652
539
 
653
540
  // Mess around with the data. It's hard to simulate all possible
@@ -694,9 +581,9 @@ TEST(CorruptedTest, VerifyCorrupted) {
694
581
 
695
582
  // try reading stuff in from a bad file.
696
583
  for (int i = 1; i <= 3; ++i) {
697
- string data = ReadTestDataFile(StringPrintf("baddata%d.snappy", i).c_str(),
698
- 0);
699
- string uncmp;
584
+ std::string data =
585
+ ReadTestDataFile(StrFormat("baddata%d.snappy", i).c_str(), 0);
586
+ std::string uncmp;
700
587
  // check that we don't return a crazy length
701
588
  size_t ulen;
702
589
  CHECK(!snappy::GetUncompressedLength(data.data(), data.size(), &ulen)
@@ -714,7 +601,7 @@ TEST(CorruptedTest, VerifyCorrupted) {
714
601
  // These mirror the compression code in snappy.cc, but are copied
715
602
  // here so that we can bypass some limitations in the how snappy.cc
716
603
  // invokes these routines.
717
- static void AppendLiteral(string* dst, const string& literal) {
604
+ static void AppendLiteral(std::string* dst, const std::string& literal) {
718
605
  if (literal.empty()) return;
719
606
  int n = literal.size() - 1;
720
607
  if (n < 60) {
@@ -729,12 +616,12 @@ static void AppendLiteral(string* dst, const string& literal) {
729
616
  n >>= 8;
730
617
  }
731
618
  dst->push_back(0 | ((59+count) << 2));
732
- *dst += string(number, count);
619
+ *dst += std::string(number, count);
733
620
  }
734
621
  *dst += literal;
735
622
  }
736
623
 
737
- static void AppendCopy(string* dst, int offset, int length) {
624
+ static void AppendCopy(std::string* dst, int offset, int length) {
738
625
  while (length > 0) {
739
626
  // Figure out how much to copy in one shot
740
627
  int to_copy;
@@ -771,51 +658,67 @@ TEST(Snappy, SimpleTests) {
771
658
  Verify("ab");
772
659
  Verify("abc");
773
660
 
774
- Verify("aaaaaaa" + string(16, 'b') + string("aaaaa") + "abc");
775
- Verify("aaaaaaa" + string(256, 'b') + string("aaaaa") + "abc");
776
- Verify("aaaaaaa" + string(2047, 'b') + string("aaaaa") + "abc");
777
- Verify("aaaaaaa" + string(65536, 'b') + string("aaaaa") + "abc");
778
- Verify("abcaaaaaaa" + string(65536, 'b') + string("aaaaa") + "abc");
661
+ Verify("aaaaaaa" + std::string(16, 'b') + std::string("aaaaa") + "abc");
662
+ Verify("aaaaaaa" + std::string(256, 'b') + std::string("aaaaa") + "abc");
663
+ Verify("aaaaaaa" + std::string(2047, 'b') + std::string("aaaaa") + "abc");
664
+ Verify("aaaaaaa" + std::string(65536, 'b') + std::string("aaaaa") + "abc");
665
+ Verify("abcaaaaaaa" + std::string(65536, 'b') + std::string("aaaaa") + "abc");
779
666
  }
780
667
 
781
668
  // Verify max blowup (lots of four-byte copies)
782
669
  TEST(Snappy, MaxBlowup) {
783
- string input;
784
- for (int i = 0; i < 20000; i++) {
785
- ACMRandom rnd(i);
786
- uint32 bytes = static_cast<uint32>(rnd.Next());
787
- input.append(reinterpret_cast<char*>(&bytes), sizeof(bytes));
788
- }
789
- for (int i = 19999; i >= 0; i--) {
790
- ACMRandom rnd(i);
791
- uint32 bytes = static_cast<uint32>(rnd.Next());
792
- input.append(reinterpret_cast<char*>(&bytes), sizeof(bytes));
670
+ std::mt19937 rng;
671
+ std::uniform_int_distribution<int> uniform_byte(0, 255);
672
+ std::string input;
673
+ for (int i = 0; i < 80000; ++i)
674
+ input.push_back(static_cast<char>(uniform_byte(rng)));
675
+
676
+ for (int i = 0; i < 80000; i += 4) {
677
+ std::string four_bytes(input.end() - i - 4, input.end() - i);
678
+ input.append(four_bytes);
793
679
  }
794
680
  Verify(input);
795
681
  }
796
682
 
797
683
  TEST(Snappy, RandomData) {
798
- ACMRandom rnd(FLAGS_test_random_seed);
799
-
800
- const int num_ops = 20000;
684
+ std::minstd_rand0 rng(FLAGS_test_random_seed);
685
+ std::uniform_int_distribution<int> uniform_0_to_3(0, 3);
686
+ std::uniform_int_distribution<int> uniform_0_to_8(0, 8);
687
+ std::uniform_int_distribution<int> uniform_byte(0, 255);
688
+ std::uniform_int_distribution<size_t> uniform_4k(0, 4095);
689
+ std::uniform_int_distribution<size_t> uniform_64k(0, 65535);
690
+ std::bernoulli_distribution one_in_ten(1.0 / 10);
691
+
692
+ constexpr int num_ops = 20000;
801
693
  for (int i = 0; i < num_ops; i++) {
802
694
  if ((i % 1000) == 0) {
803
695
  VLOG(0) << "Random op " << i << " of " << num_ops;
804
696
  }
805
697
 
806
- string x;
807
- size_t len = rnd.Uniform(4096);
698
+ std::string x;
699
+ size_t len = uniform_4k(rng);
808
700
  if (i < 100) {
809
- len = 65536 + rnd.Uniform(65536);
701
+ len = 65536 + uniform_64k(rng);
810
702
  }
811
703
  while (x.size() < len) {
812
704
  int run_len = 1;
813
- if (rnd.OneIn(10)) {
814
- run_len = rnd.Skewed(8);
705
+ if (one_in_ten(rng)) {
706
+ int skewed_bits = uniform_0_to_8(rng);
707
+ // int is guaranteed to hold at least 16 bits, this uses at most 8 bits.
708
+ std::uniform_int_distribution<int> skewed_low(0,
709
+ (1 << skewed_bits) - 1);
710
+ run_len = skewed_low(rng);
711
+ }
712
+ char c = static_cast<char>(uniform_byte(rng));
713
+ if (i >= 100) {
714
+ int skewed_bits = uniform_0_to_3(rng);
715
+ // int is guaranteed to hold at least 16 bits, this uses at most 3 bits.
716
+ std::uniform_int_distribution<int> skewed_low(0,
717
+ (1 << skewed_bits) - 1);
718
+ c = static_cast<char>(skewed_low(rng));
815
719
  }
816
- char c = (i < 100) ? rnd.Uniform(256) : rnd.Skewed(3);
817
720
  while (run_len-- > 0 && x.size() < len) {
818
- x += c;
721
+ x.push_back(c);
819
722
  }
820
723
  }
821
724
 
@@ -829,19 +732,19 @@ TEST(Snappy, FourByteOffset) {
829
732
  // copy manually.
830
733
 
831
734
  // The two fragments that make up the input string.
832
- string fragment1 = "012345689abcdefghijklmnopqrstuvwxyz";
833
- string fragment2 = "some other string";
735
+ std::string fragment1 = "012345689abcdefghijklmnopqrstuvwxyz";
736
+ std::string fragment2 = "some other string";
834
737
 
835
738
  // How many times each fragment is emitted.
836
739
  const int n1 = 2;
837
740
  const int n2 = 100000 / fragment2.size();
838
741
  const int length = n1 * fragment1.size() + n2 * fragment2.size();
839
742
 
840
- string compressed;
743
+ std::string compressed;
841
744
  Varint::Append32(&compressed, length);
842
745
 
843
746
  AppendLiteral(&compressed, fragment1);
844
- string src = fragment1;
747
+ std::string src = fragment1;
845
748
  for (int i = 0; i < n2; i++) {
846
749
  AppendLiteral(&compressed, fragment2);
847
750
  src += fragment2;
@@ -850,7 +753,7 @@ TEST(Snappy, FourByteOffset) {
850
753
  src += fragment1;
851
754
  CHECK_EQ(length, src.size());
852
755
 
853
- string uncompressed;
756
+ std::string uncompressed;
854
757
  CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size()));
855
758
  CHECK(snappy::Uncompress(compressed.data(), compressed.size(),
856
759
  &uncompressed));
@@ -872,7 +775,7 @@ TEST(Snappy, IOVecEdgeCases) {
872
775
  iov[i].iov_len = kLengths[i];
873
776
  }
874
777
 
875
- string compressed;
778
+ std::string compressed;
876
779
  Varint::Append32(&compressed, 22);
877
780
 
878
781
  // A literal whose output crosses three blocks.
@@ -933,7 +836,7 @@ TEST(Snappy, IOVecLiteralOverflow) {
933
836
  iov[i].iov_len = kLengths[i];
934
837
  }
935
838
 
936
- string compressed;
839
+ std::string compressed;
937
840
  Varint::Append32(&compressed, 8);
938
841
 
939
842
  AppendLiteral(&compressed, "12345678");
@@ -955,7 +858,7 @@ TEST(Snappy, IOVecCopyOverflow) {
955
858
  iov[i].iov_len = kLengths[i];
956
859
  }
957
860
 
958
- string compressed;
861
+ std::string compressed;
959
862
  Varint::Append32(&compressed, 8);
960
863
 
961
864
  AppendLiteral(&compressed, "123");
@@ -969,7 +872,7 @@ TEST(Snappy, IOVecCopyOverflow) {
969
872
  }
970
873
  }
971
874
 
972
- static bool CheckUncompressedLength(const string& compressed,
875
+ static bool CheckUncompressedLength(const std::string& compressed,
973
876
  size_t* ulength) {
974
877
  const bool result1 = snappy::GetUncompressedLength(compressed.data(),
975
878
  compressed.size(),
@@ -983,7 +886,7 @@ static bool CheckUncompressedLength(const string& compressed,
983
886
  }
984
887
 
985
888
  TEST(SnappyCorruption, TruncatedVarint) {
986
- string compressed, uncompressed;
889
+ std::string compressed, uncompressed;
987
890
  size_t ulength;
988
891
  compressed.push_back('\xf0');
989
892
  CHECK(!CheckUncompressedLength(compressed, &ulength));
@@ -993,7 +896,7 @@ TEST(SnappyCorruption, TruncatedVarint) {
993
896
  }
994
897
 
995
898
  TEST(SnappyCorruption, UnterminatedVarint) {
996
- string compressed, uncompressed;
899
+ std::string compressed, uncompressed;
997
900
  size_t ulength;
998
901
  compressed.push_back('\x80');
999
902
  compressed.push_back('\x80');
@@ -1008,7 +911,7 @@ TEST(SnappyCorruption, UnterminatedVarint) {
1008
911
  }
1009
912
 
1010
913
  TEST(SnappyCorruption, OverflowingVarint) {
1011
- string compressed, uncompressed;
914
+ std::string compressed, uncompressed;
1012
915
  size_t ulength;
1013
916
  compressed.push_back('\xfb');
1014
917
  compressed.push_back('\xff');
@@ -1025,14 +928,14 @@ TEST(Snappy, ReadPastEndOfBuffer) {
1025
928
  // Check that we do not read past end of input
1026
929
 
1027
930
  // Make a compressed string that ends with a single-byte literal
1028
- string compressed;
931
+ std::string compressed;
1029
932
  Varint::Append32(&compressed, 1);
1030
933
  AppendLiteral(&compressed, "x");
1031
934
 
1032
- string uncompressed;
935
+ std::string uncompressed;
1033
936
  DataEndingAtUnreadablePage c(compressed);
1034
937
  CHECK(snappy::Uncompress(c.data(), c.size(), &uncompressed));
1035
- CHECK_EQ(uncompressed, string("x"));
938
+ CHECK_EQ(uncompressed, std::string("x"));
1036
939
  }
1037
940
 
1038
941
  // Check for an infinite loop caused by a copy with offset==0
@@ -1153,17 +1056,20 @@ TEST(Snappy, FindMatchLength) {
1153
1056
  }
1154
1057
 
1155
1058
  TEST(Snappy, FindMatchLengthRandom) {
1156
- const int kNumTrials = 10000;
1157
- const int kTypicalLength = 10;
1158
- ACMRandom rnd(FLAGS_test_random_seed);
1059
+ constexpr int kNumTrials = 10000;
1060
+ constexpr int kTypicalLength = 10;
1061
+ std::minstd_rand0 rng(FLAGS_test_random_seed);
1062
+ std::uniform_int_distribution<int> uniform_byte(0, 255);
1063
+ std::bernoulli_distribution one_in_two(1.0 / 2);
1064
+ std::bernoulli_distribution one_in_typical_length(1.0 / kTypicalLength);
1159
1065
 
1160
1066
  for (int i = 0; i < kNumTrials; i++) {
1161
- string s, t;
1162
- char a = rnd.Rand8();
1163
- char b = rnd.Rand8();
1164
- while (!rnd.OneIn(kTypicalLength)) {
1165
- s.push_back(rnd.OneIn(2) ? a : b);
1166
- t.push_back(rnd.OneIn(2) ? a : b);
1067
+ std::string s, t;
1068
+ char a = static_cast<char>(uniform_byte(rng));
1069
+ char b = static_cast<char>(uniform_byte(rng));
1070
+ while (!one_in_typical_length(rng)) {
1071
+ s.push_back(one_in_two(rng) ? a : b);
1072
+ t.push_back(one_in_two(rng) ? a : b);
1167
1073
  }
1168
1074
  DataEndingAtUnreadablePage u(s);
1169
1075
  DataEndingAtUnreadablePage v(t);
@@ -1197,7 +1103,6 @@ TEST(Snappy, VerifyCharTable) {
1197
1103
  using snappy::internal::COPY_2_BYTE_OFFSET;
1198
1104
  using snappy::internal::COPY_4_BYTE_OFFSET;
1199
1105
  using snappy::internal::char_table;
1200
- using snappy::internal::wordmask;
1201
1106
 
1202
1107
  uint16 dst[256];
1203
1108
 
@@ -1274,49 +1179,46 @@ TEST(Snappy, VerifyCharTable) {
1274
1179
  }
1275
1180
 
1276
1181
  static void CompressFile(const char* fname) {
1277
- string fullinput;
1182
+ std::string fullinput;
1278
1183
  CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults()));
1279
1184
 
1280
- string compressed;
1185
+ std::string compressed;
1281
1186
  Compress(fullinput.data(), fullinput.size(), SNAPPY, &compressed, false);
1282
1187
 
1283
- CHECK_OK(file::SetContents(string(fname).append(".comp"), compressed,
1188
+ CHECK_OK(file::SetContents(std::string(fname).append(".comp"), compressed,
1284
1189
  file::Defaults()));
1285
1190
  }
1286
1191
 
1287
1192
  static void UncompressFile(const char* fname) {
1288
- string fullinput;
1193
+ std::string fullinput;
1289
1194
  CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults()));
1290
1195
 
1291
1196
  size_t uncompLength;
1292
1197
  CHECK(CheckUncompressedLength(fullinput, &uncompLength));
1293
1198
 
1294
- string uncompressed;
1199
+ std::string uncompressed;
1295
1200
  uncompressed.resize(uncompLength);
1296
1201
  CHECK(snappy::Uncompress(fullinput.data(), fullinput.size(), &uncompressed));
1297
1202
 
1298
- CHECK_OK(file::SetContents(string(fname).append(".uncomp"), uncompressed,
1203
+ CHECK_OK(file::SetContents(std::string(fname).append(".uncomp"), uncompressed,
1299
1204
  file::Defaults()));
1300
1205
  }
1301
1206
 
1302
1207
  static void MeasureFile(const char* fname) {
1303
- string fullinput;
1208
+ std::string fullinput;
1304
1209
  CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults()));
1305
1210
  printf("%-40s :\n", fname);
1306
1211
 
1307
1212
  int start_len = (FLAGS_start_len < 0) ? fullinput.size() : FLAGS_start_len;
1308
1213
  int end_len = fullinput.size();
1309
1214
  if (FLAGS_end_len >= 0) {
1310
- end_len = min<int>(fullinput.size(), FLAGS_end_len);
1215
+ end_len = std::min<int>(fullinput.size(), FLAGS_end_len);
1311
1216
  }
1312
1217
  for (int len = start_len; len <= end_len; len++) {
1313
1218
  const char* const input = fullinput.data();
1314
1219
  int repeats = (FLAGS_bytes + len) / (len + 1);
1315
1220
  if (FLAGS_zlib) Measure(input, len, ZLIB, repeats, 1024<<10);
1316
1221
  if (FLAGS_lzo) Measure(input, len, LZO, repeats, 1024<<10);
1317
- if (FLAGS_liblzf) Measure(input, len, LIBLZF, repeats, 1024<<10);
1318
- if (FLAGS_quicklz) Measure(input, len, QUICKLZ, repeats, 1024<<10);
1319
- if (FLAGS_fastlz) Measure(input, len, FASTLZ, repeats, 1024<<10);
1320
1222
  if (FLAGS_snappy) Measure(input, len, SNAPPY, repeats, 4096<<10);
1321
1223
 
1322
1224
  // For block-size based measurements
@@ -1356,10 +1258,10 @@ static void BM_UFlat(int iters, int arg) {
1356
1258
  // Pick file to process based on "arg"
1357
1259
  CHECK_GE(arg, 0);
1358
1260
  CHECK_LT(arg, ARRAYSIZE(files));
1359
- string contents = ReadTestDataFile(files[arg].filename,
1360
- files[arg].size_limit);
1261
+ std::string contents =
1262
+ ReadTestDataFile(files[arg].filename, files[arg].size_limit);
1361
1263
 
1362
- string zcontents;
1264
+ std::string zcontents;
1363
1265
  snappy::Compress(contents.data(), contents.size(), &zcontents);
1364
1266
  char* dst = new char[contents.size()];
1365
1267
 
@@ -1382,10 +1284,10 @@ static void BM_UValidate(int iters, int arg) {
1382
1284
  // Pick file to process based on "arg"
1383
1285
  CHECK_GE(arg, 0);
1384
1286
  CHECK_LT(arg, ARRAYSIZE(files));
1385
- string contents = ReadTestDataFile(files[arg].filename,
1386
- files[arg].size_limit);
1287
+ std::string contents =
1288
+ ReadTestDataFile(files[arg].filename, files[arg].size_limit);
1387
1289
 
1388
- string zcontents;
1290
+ std::string zcontents;
1389
1291
  snappy::Compress(contents.data(), contents.size(), &zcontents);
1390
1292
 
1391
1293
  SetBenchmarkBytesProcessed(static_cast<int64>(iters) *
@@ -1405,10 +1307,10 @@ static void BM_UIOVec(int iters, int arg) {
1405
1307
  // Pick file to process based on "arg"
1406
1308
  CHECK_GE(arg, 0);
1407
1309
  CHECK_LT(arg, ARRAYSIZE(files));
1408
- string contents = ReadTestDataFile(files[arg].filename,
1409
- files[arg].size_limit);
1310
+ std::string contents =
1311
+ ReadTestDataFile(files[arg].filename, files[arg].size_limit);
1410
1312
 
1411
- string zcontents;
1313
+ std::string zcontents;
1412
1314
  snappy::Compress(contents.data(), contents.size(), &zcontents);
1413
1315
 
1414
1316
  // Uncompress into an iovec containing ten entries.
@@ -1451,10 +1353,10 @@ static void BM_UFlatSink(int iters, int arg) {
1451
1353
  // Pick file to process based on "arg"
1452
1354
  CHECK_GE(arg, 0);
1453
1355
  CHECK_LT(arg, ARRAYSIZE(files));
1454
- string contents = ReadTestDataFile(files[arg].filename,
1455
- files[arg].size_limit);
1356
+ std::string contents =
1357
+ ReadTestDataFile(files[arg].filename, files[arg].size_limit);
1456
1358
 
1457
- string zcontents;
1359
+ std::string zcontents;
1458
1360
  snappy::Compress(contents.data(), contents.size(), &zcontents);
1459
1361
  char* dst = new char[contents.size()];
1460
1362
 
@@ -1469,7 +1371,7 @@ static void BM_UFlatSink(int iters, int arg) {
1469
1371
  }
1470
1372
  StopBenchmarkTiming();
1471
1373
 
1472
- string s(dst, contents.size());
1374
+ std::string s(dst, contents.size());
1473
1375
  CHECK_EQ(contents, s);
1474
1376
 
1475
1377
  delete[] dst;
@@ -1483,8 +1385,8 @@ static void BM_ZFlat(int iters, int arg) {
1483
1385
  // Pick file to process based on "arg"
1484
1386
  CHECK_GE(arg, 0);
1485
1387
  CHECK_LT(arg, ARRAYSIZE(files));
1486
- string contents = ReadTestDataFile(files[arg].filename,
1487
- files[arg].size_limit);
1388
+ std::string contents =
1389
+ ReadTestDataFile(files[arg].filename, files[arg].size_limit);
1488
1390
 
1489
1391
  char* dst = new char[snappy::MaxCompressedLength(contents.size())];
1490
1392
 
@@ -1499,16 +1401,89 @@ static void BM_ZFlat(int iters, int arg) {
1499
1401
  StopBenchmarkTiming();
1500
1402
  const double compression_ratio =
1501
1403
  static_cast<double>(zsize) / std::max<size_t>(1, contents.size());
1502
- SetBenchmarkLabel(StringPrintf("%s (%.2f %%)",
1503
- files[arg].label, 100.0 * compression_ratio));
1504
- VLOG(0) << StringPrintf("compression for %s: %zd -> %zd bytes",
1505
- files[arg].label, contents.size(), zsize);
1404
+ SetBenchmarkLabel(StrFormat("%s (%.2f %%)", files[arg].label,
1405
+ 100.0 * compression_ratio));
1406
+ VLOG(0) << StrFormat("compression for %s: %zd -> %zd bytes",
1407
+ files[arg].label, static_cast<int>(contents.size()),
1408
+ static_cast<int>(zsize));
1506
1409
  delete[] dst;
1507
1410
  }
1508
1411
  BENCHMARK(BM_ZFlat)->DenseRange(0, ARRAYSIZE(files) - 1);
1509
1412
 
1510
- } // namespace snappy
1413
+ static void BM_ZFlatAll(int iters, int arg) {
1414
+ StopBenchmarkTiming();
1415
+
1416
+ CHECK_EQ(arg, 0);
1417
+ const int num_files = ARRAYSIZE(files);
1418
+
1419
+ std::vector<std::string> contents(num_files);
1420
+ std::vector<char*> dst(num_files);
1421
+
1422
+ int64 total_contents_size = 0;
1423
+ for (int i = 0; i < num_files; ++i) {
1424
+ contents[i] = ReadTestDataFile(files[i].filename, files[i].size_limit);
1425
+ dst[i] = new char[snappy::MaxCompressedLength(contents[i].size())];
1426
+ total_contents_size += contents[i].size();
1427
+ }
1428
+
1429
+ SetBenchmarkBytesProcessed(static_cast<int64>(iters) * total_contents_size);
1430
+ StartBenchmarkTiming();
1431
+
1432
+ size_t zsize = 0;
1433
+ while (iters-- > 0) {
1434
+ for (int i = 0; i < num_files; ++i) {
1435
+ snappy::RawCompress(contents[i].data(), contents[i].size(), dst[i],
1436
+ &zsize);
1437
+ }
1438
+ }
1439
+ StopBenchmarkTiming();
1511
1440
 
1441
+ for (int i = 0; i < num_files; ++i) {
1442
+ delete[] dst[i];
1443
+ }
1444
+ SetBenchmarkLabel(StrFormat("%d files", num_files));
1445
+ }
1446
+ BENCHMARK(BM_ZFlatAll)->DenseRange(0, 0);
1447
+
1448
+ static void BM_ZFlatIncreasingTableSize(int iters, int arg) {
1449
+ StopBenchmarkTiming();
1450
+
1451
+ CHECK_EQ(arg, 0);
1452
+ CHECK_GT(ARRAYSIZE(files), 0);
1453
+ const std::string base_content =
1454
+ ReadTestDataFile(files[0].filename, files[0].size_limit);
1455
+
1456
+ std::vector<std::string> contents;
1457
+ std::vector<char*> dst;
1458
+ int64 total_contents_size = 0;
1459
+ for (int table_bits = kMinHashTableBits; table_bits <= kMaxHashTableBits;
1460
+ ++table_bits) {
1461
+ std::string content = base_content;
1462
+ content.resize(1 << table_bits);
1463
+ dst.push_back(new char[snappy::MaxCompressedLength(content.size())]);
1464
+ total_contents_size += content.size();
1465
+ contents.push_back(std::move(content));
1466
+ }
1467
+
1468
+ size_t zsize = 0;
1469
+ SetBenchmarkBytesProcessed(static_cast<int64>(iters) * total_contents_size);
1470
+ StartBenchmarkTiming();
1471
+ while (iters-- > 0) {
1472
+ for (int i = 0; i < contents.size(); ++i) {
1473
+ snappy::RawCompress(contents[i].data(), contents[i].size(), dst[i],
1474
+ &zsize);
1475
+ }
1476
+ }
1477
+ StopBenchmarkTiming();
1478
+
1479
+ for (int i = 0; i < dst.size(); ++i) {
1480
+ delete[] dst[i];
1481
+ }
1482
+ SetBenchmarkLabel(StrFormat("%zd tables", contents.size()));
1483
+ }
1484
+ BENCHMARK(BM_ZFlatIncreasingTableSize)->DenseRange(0, 0);
1485
+
1486
+ } // namespace snappy
1512
1487
 
1513
1488
  int main(int argc, char** argv) {
1514
1489
  InitGoogle(argv[0], &argc, &argv, true);
@@ -1517,11 +1492,11 @@ int main(int argc, char** argv) {
1517
1492
  if (argc >= 2) {
1518
1493
  for (int arg = 1; arg < argc; arg++) {
1519
1494
  if (FLAGS_write_compressed) {
1520
- CompressFile(argv[arg]);
1495
+ snappy::CompressFile(argv[arg]);
1521
1496
  } else if (FLAGS_write_uncompressed) {
1522
- UncompressFile(argv[arg]);
1497
+ snappy::UncompressFile(argv[arg]);
1523
1498
  } else {
1524
- MeasureFile(argv[arg]);
1499
+ snappy::MeasureFile(argv[arg]);
1525
1500
  }
1526
1501
  }
1527
1502
  return 0;