TL; DR: бессмысленно сравнивать скорость вариантов кода при одном размере ввода; сравнение эмпирических порядков роста действительно отражает алгоритмическую природу кода и будет согласованным на разных тестовых платформах для одного и того же тестового диапазона входных размеров. Сравнение абсолютных значений скорости имеет смысл только для вариантов кода, которые демонстрируют такое же асимптотическое или, по крайней мере, локальное поведение роста.
Недостаточно измерить скорость ваших двух реализаций только при одном размере ввода. Обычно требуется несколько точек данных, чтобы оценить время выполнения эмпирических порядков роста нашего кода. (потому что код можно запускать с разными размерами ввода). Он находится как логарифм отношения времени выполнения на основе отношения размеров входных данных.
Таким образом, даже если на некотором вводе code_1
работает в 10 раз быстрее, чем code_2
, но его время выполнения удваивается с каждым удвоением размера ввода, тогда как для code_2
оно увеличивается только как 1.1x, очень скоро code_2
станет намного быстрее, чем code_1
.
Таким образом, реальной мерой эффективности алгоритма является его сложность времени выполнения (и сложность его пространства, т. Е. требования к памяти). И когда мы измеряем его эмпирически, мы измеряем только if для конкретного кода под рукой (в конкретном диапазоне входных размеров), а не для самого алгоритма, то есть для его идеальной реализации.
В частности, теоретическая сложность пробного деления составляет O(n^1.5 / (log n)^0.5)
в n простых числах, обычно рассматриваемых как ~ n^1.40..1.45
эмпирический порядок роста (но изначально он может быть ~n^1.3
для меньших размеров входных данных). Для сита Эратосфена это O(n log n log (log n))
, обычно обозначаемый ~ n^1.1..1.2
. Но, безусловно, существуют неоптимальные реализации как пробного деления, так и сита Эратосфена, которые работают на ~n^2.0
и хуже.
Итак, нет, это ничего не доказывает. Одна точка данных бессмысленна, по крайней мере три необходимы, чтобы получить "общую картину", т.е. иметь возможность предсказать с некоторой уверенностью, пространство времени выполнения, необходимое для больших размеров ввода.
Прогноз с известной достоверностью - это то, что научный метод а> это все о.
Кстати, у вас очень долгое время работы. Вычисление 10 000 простых чисел должно происходить почти мгновенно, намного меньше, чем 1/100 секунды для программы C, выполняемой на быстром блоке. Возможно, вы также измеряете время печати. Не надо. :)
person
Will Ness
schedule
21.08.2013