Created
March 27, 2014 14:57
-
-
Save chuckremes/9809387 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cremes$ ./bin/benchmark core/file/bench_seek.rb | |
=== rbx === | |
seek through a small file randomly (SEEK_SET) | |
4115.1 (±4.2%) i/s - 20650 in 5.028761s (cycle=350) | |
seek through a medium file randomly (SEEK_SET) | |
4236.1 (±1.6%) i/s - 21372 in 5.046543s (cycle=411) | |
seek through a large file randomly (SEEK_SET) | |
4257.4 (±1.0%) i/s - 21320 in 5.008270s (cycle=410) | |
seek through a small file randomly (SEEK_CUR) | |
2124.6 (±4.0%) i/s - 10764 in 5.076670s (cycle=207) | |
seek through a medium file randomly (SEEK_CUR) | |
2133.1 (±2.3%) i/s - 10710 in 5.023500s (cycle=210) | |
seek through a large file randomly (SEEK_CUR) | |
2070.6 (±2.5%) i/s - 10400 in 5.025814s (cycle=208) | |
FFI File2 | |
seek through a small file randomly (SEEK_SET) | |
7798.2 (±0.9%) i/s - 39312 in 5.041576s (cycle=702) | |
seek through a medium file randomly (SEEK_SET) | |
6643.3 (±0.6%) i/s - 33332 in 5.017553s (cycle=641) | |
seek through a large file randomly (SEEK_SET) | |
6511.3 (±0.9%) i/s - 33124 in 5.087504s (cycle=637) | |
seek through a small file randomly (SEEK_CUR) | |
3622.3 (±0.9%) i/s - 18105 in 4.998621s (cycle=355) | |
seek through a medium file randomly (SEEK_CUR) | |
3284.6 (±1.1%) i/s - 16588 in 5.050882s (cycle=319) | |
seek through a large file randomly (SEEK_CUR) | |
3235.7 (±1.0%) i/s - 16432 in 5.078839s (cycle=316) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'benchmark' | |
require 'benchmark/ips' | |
small_file = File.join(File.dirname(__FILE__), 'small.txt') | |
medium_file = File.join(File.dirname(__FILE__), 'medium.txt') | |
large_file = File.join(File.dirname(__FILE__), 'large.txt') | |
# Open these before the actual benchmarks so we don't also benchmark | |
# File.open(). | |
small_handle = File.open(small_file, 'r') | |
medium_handle = File.open(medium_file, 'r') | |
large_handle = File.open(large_file, 'r') | |
small_handle2 = File2.open(small_file, 'r') | |
medium_handle2 = File2.open(medium_file, 'r') | |
large_handle2 = File2.open(large_file, 'r') | |
# Precompute the "random" offsets to read from for each file. We want | |
# these benchmarks to be as deterministic as possible, hence the | |
# precalc. | |
# | |
# Calculation came from formula: | |
# | |
# 200.times.map { |i| rand(file_size + i) % file_size } | |
# | |
# This produces a 200 element array containing offsets that are between | |
# 0 and (file_size + 200) with a cap at file_size so we don't try to | |
# seek past the EOF. | |
# | |
small_random_offsets = [6739, 10108, 5903, 778, 9574, 6982, 6525, 5740, | |
2218, 1306, 12721, 7063, 12651, 1563, 13001, 7321, 4356, 11643, | |
6091, 3577, 147, 14, 8371, 2194, 2391, 5494, 9617, 9027, 6591, 7865, | |
5269, 1310, 6203, 10555, 5989, 10392, 9633, 8088, 4606, 3059, 9810, | |
11661, 2373, 7650, 2038, 1395, 3440, 3088, 10801, 7133, 8829, 2925, | |
3713, 5711, 6654, 11005, 11166, 12827, 1208, 8620, 7558, 12033, 9361, | |
8193, 9411, 219, 1377, 3430, 12700, 7563, 6797, 11736, 12765, 4382, | |
949, 6825, 270, 4115, 9819, 9788, 5155, 8472, 3235, 6433, 1886, 4762, | |
10787, 11351, 8506, 5441, 1724, 3733, 3228, 10013, 2952, 7398, 4856, | |
11100, 12842, 9338, 2990, 7066, 6877, 1945, 663, 6384, 3568, 7591, | |
11847, 708, 3642, 12018, 2367, 5541, 11867, 1524, 8211, 5904, 4317, | |
3870, 6983, 11975, 3538, 11995, 9296, 6169, 6500, 7695, 5542, 6312, | |
1959, 1140, 1970, 1406, 12935, 7481, 10155, 10855, 7463, 7490, 9936, | |
5671, 11229, 10643, 10022, 7042, 5988, 6128, 11725, 12207, 9392, | |
8493, 7031, 12260, 2233, 7450, 4514, 11164, 6328, 8795, 13369, 8048, | |
1408, 488, 3826, 12608, 9419, 9624, 12771, 13231, 13015, 12368, 12591, | |
1037, 13101, 7351, 2423, 5528, 10211, 6730, 5131, 764, 6063, 5274, | |
3433, 12800, 7565, 12420, 13298, 5695, 7363, 12206, 3272, 358, 6682, | |
8081, 8871, 10331, 5237, 401] | |
medium_random_offsets = [34001, 3748, 25682, 63523, 93222, 2904, | |
104054, 32107, 93359, 1419, 68354, 78761, 88845, 24184, 73594, | |
119164, 50156, 12034, 95232, 75610, 43466, 6276, 33481, 40125, 76831, | |
2058, 65842, 27193, 60930, 55491, 21943, 17988, 11628, 34259, 61404, | |
2832, 54378, 78537, 117972, 90909, 64210, 60949, 91775, 94188, 21908, | |
36416, 38189, 15103, 88479, 58006, 109977, 26694, 66376, 61148, | |
101486, 27656, 86103, 64497, 103860, 27538, 54460, 112983, 23810, | |
71751, 42422, 38103, 54977, 13339, 4576, 14359, 52778, 56140, 32887, | |
81503, 101891, 55718, 70837, 103941, 114503, 7700, 8704, 90619, | |
39616, 42434, 101547, 119993, 101513, 48194, 18545, 72021, 58397, | |
88139, 118161, 112992, 16974, 91671, 3690, 5275, 35552, 92780, | |
72567, 2916, 49364, 28011, 111152, 110099, 40443, 114971, 107366, | |
3718, 66432, 84901, 62212, 1987, 77935, 102431, 66051, 112522, | |
114943, 46796, 26694, 39580, 6454, 76099, 26181, 54292, 37125, | |
101805, 87570, 111325, 16242, 43340, 4891, 42823, 8177, 71548, | |
118189, 106700, 118459, 36150, 105246, 36731, 99767, 31116, 41878, | |
76587, 109033, 38706, 111803, 44091, 4135, 52009, 33859, 96758, | |
13923, 95010, 89910, 53142, 64976, 99380, 96311, 12167, 95706, 93073, | |
108685, 64060, 63864, 60615, 88523, 18604, 20144, 117358, 81061, | |
107873, 23141, 114231, 36538, 77219, 83900, 108753, 34977, 113033, | |
83524, 13231, 107187, 39892, 83649, 23676, 58, 14011, 31132, 92902, | |
66765, 16360, 64612, 84622, 105164, 35924, 90400, 7430] | |
large_random_offsets = [889462, 400991, 360712, 873802, 394129, 637177, | |
138115, 123482, 1064678, 1163276, 182575, 73370, 1148965, 1012280, | |
1145459, 61544, 964920, 645598, 179953, 506305, 783315, 897490, | |
1015400, 437364, 474685, 581871, 63514, 810312, 283890, 258107, | |
486707, 489366, 1062487, 374352, 688286, 330410, 1037494, 1168483, | |
257469, 121533, 276014, 783894, 949756, 1132615, 356521, 844182, | |
1070455, 921172, 1049643, 995127, 370387, 27449, 479581, 115549, | |
166351, 544023, 393010, 207966, 486445, 972527, 455199, 840549, | |
70056, 1071111, 516013, 425640, 719652, 1187659, 810496, 231804, | |
402662, 455885, 379497, 333333, 870151, 362032, 1078390, 481349, | |
455451, 242664, 217999, 217826, 143851, 1134641, 112310, 331621, | |
920315, 228624, 885077, 171813, 746488, 571341, 780478, 1194862, | |
735368, 162249, 1125192, 1191040, 914459, 452828, 360312, 46859, | |
509565, 281170, 495155, 50815, 290742, 1105757, 1199085, 725806, | |
332515, 800569, 201483, 883327, 323320, 257442, 31168, 1103464, | |
823533, 364215, 599077, 410854, 546529, 178264, 707411, 176717, | |
488201, 1095625, 1043748, 1106262, 63077, 342038, 476262, 683963, | |
943365, 150811, 180769, 970639, 725235, 820170, 877219, 1017035, | |
146970, 128574, 386191, 268749, 994635, 679053, 239187, 74167, | |
235103, 680400, 983765, 889134, 906639, 1100887, 1169605, 891350, | |
480359, 80155, 1143690, 987097, 449004, 958340, 805949, 951824, | |
1195600, 1082203, 693506, 305216, 873739, 518915, 1059623, 1115496, | |
943442, 793892, 808045, 1098238, 469684, 238695, 613498, 461613, | |
653321, 452020, 157183, 923372, 401727, 572081, 944092, 104469, | |
94495, 1034323, 877809, 69802, 143367, 42969, 30933, 725339, 968477, 730331] | |
Benchmark.ips do |x| | |
x.report "seek through a small file randomly (SEEK_SET)" do |times| | |
i = 0 | |
small_handle.rewind | |
while i < times | |
j = 0 | |
while j < small_random_offsets.size | |
small_handle.seek(small_random_offsets[j]) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a medium file randomly (SEEK_SET)" do |times| | |
i = 0 | |
medium_handle.rewind | |
while i < times | |
j = 0 | |
while j < medium_random_offsets.size | |
medium_handle.seek(medium_random_offsets[j]) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a large file randomly (SEEK_SET)" do |times| | |
i = 0 | |
large_handle.rewind | |
while i < times | |
j = 0 | |
while j < large_random_offsets.size | |
large_handle.seek(large_random_offsets[j]) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a small file randomly (SEEK_CUR)" do |times| | |
i = 0 | |
small_handle.rewind | |
while i < times | |
j = 0 | |
while j < small_random_offsets.size | |
# first seek to this absolute position, then do a relative seek | |
small_handle.seek(small_random_offsets[j]) | |
small_handle.seek(small_random_offsets[j], File::SEEK_CUR) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a medium file randomly (SEEK_CUR)" do |times| | |
i = 0 | |
medium_handle.rewind | |
while i < times | |
j = 0 | |
while j < medium_random_offsets.size | |
medium_handle.seek(medium_random_offsets[j]) | |
medium_handle.seek(medium_random_offsets[j], File::SEEK_CUR) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a large file randomly (SEEK_CUR)" do |times| | |
i = 0 | |
large_handle.rewind | |
while i < times | |
j = 0 | |
while j < large_random_offsets.size | |
large_handle.seek(large_random_offsets[j]) | |
large_handle.seek(large_random_offsets[j], File::SEEK_CUR) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a small file randomly (SEEK_SET)" do |times| | |
i = 0 | |
small_handle2.rewind | |
while i < times | |
j = 0 | |
while j < small_random_offsets.size | |
small_handle2.seek(small_random_offsets[j]) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a medium file randomly (SEEK_SET)" do |times| | |
i = 0 | |
medium_handle2.rewind | |
while i < times | |
j = 0 | |
while j < medium_random_offsets.size | |
medium_handle2.seek(medium_random_offsets[j]) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a large file randomly (SEEK_SET)" do |times| | |
i = 0 | |
large_handle2.rewind | |
while i < times | |
j = 0 | |
while j < large_random_offsets.size | |
large_handle2.seek(large_random_offsets[j]) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a small file randomly (SEEK_CUR)" do |times| | |
i = 0 | |
small_handle2.rewind | |
while i < times | |
j = 0 | |
while j < small_random_offsets.size | |
small_handle2.seek(small_random_offsets[j]) | |
small_handle2.seek(small_random_offsets[j], File::SEEK_CUR) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a medium file randomly (SEEK_CUR)" do |times| | |
i = 0 | |
medium_handle2.rewind | |
while i < times | |
j = 0 | |
while j < medium_random_offsets.size | |
medium_handle2.seek(medium_random_offsets[j]) | |
medium_handle2.seek(medium_random_offsets[j], File::SEEK_CUR) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
x.report "seek through a large file randomly (SEEK_CUR)" do |times| | |
i = 0 | |
large_handle2.rewind | |
while i < times | |
j = 0 | |
while j < large_random_offsets.size | |
large_handle2.seek(large_random_offsets[j]) | |
large_handle2.seek(large_random_offsets[j], File::SEEK_CUR) | |
j += 1 | |
end | |
i += 1 | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment