Отчет о недопустимых критериях при тестировании на больших входах с помощью AutoBench

Я работаю с AutoBench с тех пор, как несколько дней тестировал производительность сита Эйлера на входах разных размеров.

Мои тесты просто запрашивают n-е простое число внутри списка, созданного решетом Эйлера.

Хотя Criterion хорошо работает с небольшими входными данными для n, похоже, что он не дает достоверного отчета, когда n больше 7000.

Вот мой проверенный файл Input.hs:

eS :: Int -> Int
eS x = (eulerSieve [2..]) !! x where
  eulerSieve cs@(p:tcs) = p:eulerSieve (minus tcs (map (p*) cs))

tDat :: UnaryTestData Int
tDat  = 
  [ (1000, return 1000)
  , (2000, return 2000)
  , (3000, return 3000)
  , (4000, return 4000)
  , (5000, return 5000)
  , (6000, return 6000)
  , (7000, return 7000)
  , (8000, return 8000)
  , (9000, return 9000)
  , (10000, return 10000)
  , (11000, return 11000)
  , (12000, return 12000)
  , (13000, return 13000)
  , (14000, return 14000)
  , (15000, return 15000)
  , (16000, return 16000)
  , (17000, return 17000)
  , (18000, return 18000)
  , (19000, return 19000)
  , (20000, return 20000)
  ]

ts :: TestSuite 
ts  = def {
  _progs = ["eS"],
  _dataOpts = Manual "tDat"
}

И это ошибка, которую я получаю:

benchmarking Input Size 8000/Input.eS
 • Executed benchmarking file ✔
 • Generating test report
File error: Invalid Criterion report: Error in $: not enough input
Testing cancelled. Press any key to exit... 
Leaving AutoBench.

Я думаю, что это что-то связано с временем выполнения, необходимым для того, чтобы процедура ответила n-м простым числом, но я не нашел ничего в Интернете, кроме официальной документации, в которой ничего не упоминается об этом.

1 ответ

Решение

После некоторого профилирования я обнаружил, что для n больше 7000 процедура Эйлера быстро насыщает плунжер, вызывая сбой Criterion.

Единственные способы преодолеть эту проблему - увеличить объем оперативной памяти или перейти на другой алгоритм / реализацию.

Другие вопросы по тегам