| |
| #include "cache_size.h" |
| |
| #include <iostream> |
| // Measure how often measuring time is able to accurately determine cache hits |
| // and cache misses based on the buffer size under analysis and the cache size |
| // it checks whether buffer sizes that fit in cache have less reading time or |
| // not |
| int main(int argc, char* argv[]) { |
| static constexpr long kCacheSize = 8 * 1024 * 1024; |
| static constexpr long kIterations = 2; |
| static constexpr long kTestSizes = 4; |
| |
| // generates a list of numbers that are used to determine the size of buffers |
| std::vector<int> candidates; |
| for (int i = 0; i < kTestSizes; ++i) { |
| candidates.push_back(20 * (i + 1)); |
| } |
| int total_passed_tests = 0; |
| for (int i = 0; i < kIterations; i++) { |
| int passed_tests = 0; |
| for (int candidate_large : candidates) { |
| uint64_t res_large = FindMaxReadingTime(kCacheSize * candidate_large); |
| |
| for (int candidate_small : candidates) { |
| uint64_t res_small = FindMaxReadingTime(kCacheSize / candidate_small); |
| // we expect that buffer sizes < cache size always have less reading |
| // times as they all should result in cache hits while buffer sizes > |
| // cache size suffer from cache misses, so they must take longer to be |
| // read |
| if (res_large <= res_small) { |
| std::cout << "test failed" << std::endl; |
| } else { |
| std::cout << "test passed" << std::endl; |
| passed_tests++; |
| } |
| } |
| } |
| std::cout << "In total out of " << kTestSizes * kTestSizes |
| << " comparisons " << passed_tests << " were successfully passed." |
| << std::endl; |
| total_passed_tests += passed_tests; |
| } |
| float res = |
| total_passed_tests * 100 / (kIterations * kTestSizes * kTestSizes); |
| std::cout << res << "% of tests passed." << std::endl; |
| if (res > 99) return 0; |
| return 1; |
| } |