Процесс, который я пытаюсь вычислить, выполняется за 0 наносекунд. как? - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь вычислить производительность моего алгоритма. В основном мой алгоритм решает операции над множествами, такие как объединение, разделение, пересечение и т. Д. Мой алгоритм может выполнять эти операции в O (logn) для сравнения с аналогичными алгоритмами, в которых реализован примитивный подход к решению, алгоритм фильтра Блумса , отсортировано Список, но когда я попытался вычислить время выполнения, я увидел, что для выполнения некоторых операций в другом алгоритме требуется буквально 0 (ноль) наносекунд. Под операцией я подразумеваю поиск объединения из двух наборов, каждый из которых содержит 10000 элементов. Как это возможно? Вы можете увидеть мой проект на Github . Часть, которую я рассчитываю, находится на тестовом пакете

Я пытался использовать Jprofilier, чтобы убедиться, что все работает в одном потоке

Я пытался отладить интервалы времени, чтобы убедиться, что он не пренебрегает вычислениями, и находит правильные результаты

static Duration IntersectDocumentsTime(AlgorithmInterface algorithm)
{
        Instant start = Instant.now(); // Time before calulation i tryed to put breakpoint here
        algorithm.IntersectDocuments(); // returns Term[] result of elements after union operation
        Instant end = Instant.now(); // Time after calulation
        return Duration.between(start,end); // i put a breakpoint here to see if IntersectDocuments() result is correct and actually calculated
}

Вот так я печатаю результат

for (AlgorithmInterface al: Algorithms)
        {
            System.out.println("------------------------------------------------------------------------------");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Union\nTime: "
                    +OperationsInterface.AddDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Disjuction\nTime: "
                    +OperationsInterface.DisjointDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Intersection\nTime: "
                    +OperationsInterface.IntersectDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Subtraction\nTime: "
                    +OperationsInterface.SubtractDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Find\nTime: "
                    +OperationsInterface.ContainsTermTime(al,new Term("A")).toNanos()+"\tseconds");
        }
System.out.println("------------------------------------------------------------------------------");

Результат выглядит так


Алгоритм: Алгоритмы класса.FNA.FNA Операция: Союз Время: 1851133600 секунд Алгоритм: Алгоритмы класса. FNA.FNA Операция: Disjuction Время: 1799607700 секунд Алгоритм: Алгоритмы класса. FNA.FNA Операция: Пересечение Время: 291703600 секунд Алгоритм: Алгоритмы класса. FNA.FNA Операция: Вычитание Время: 1022775100 секунд Алгоритм: класс Алгоритмы.FNA.FNA Операция: Найти Время: 1319100 секунд


Алгоритм: Алгоритмы класса. Примитив. Примитивная операция: объединение Время: 81257800 секунд Алгоритм: Алгоритмы класса. Примитив. Примитивная операция: дизъюкция Время: 85717600 секунд Алгоритм: Алгоритмы класса. Примитив. Примитивная операция: Пересечение Время: 0 секунд Алгоритм: Алгоритмы класса. Примитив. Примитивная операция: Вычитание Время 66472900 секунд Алгоритм: класс Algorithms.Primitive.Primitive Операция: Найти Время: 0 секунд


Алгоритм: класс Algorithms.BloomsFilter.BloomsFilter Операция: Союз Время 998900 секунд Алгоритм: класс Algorithms.BloomsFilter.BloomsFilter Операция: Disjuction Время: 0 секунд Алгоритм: класс Algorithms.BloomsFilter.BloomsFilter Операция: Пересечение Время: 503800 секунд Алгоритм: класс Algorithms.BloomsFilter.BloomsFilter Операция: Вычитание Время: 0 секунд Алгоритм: класс Алгоритмы.BloomsFilter.BloomsFilter Операция: Найти Время: 1312900 секунд


Алгоритм: класс Algorithms.SortedList.SortedList Операция: Объединение Время: 0 секунд Алгоритм: класс Алгоритмы.SortedList.SortedList Операция: Disjuction Время: 3721800 секунд Алгоритм: класс Algorithms.SortedList.SortedList Операция: Пересечение Время: 0 секунд Алгоритм: класс Алгоритмы.SortedList.SortedList Операция: Вычитание Время: 810500 секунд Алгоритм: класс Algorithms.SortedList.SortedList Операция: Найти Время: 1173200 секунд


Ответы [ 2 ]

4 голосов
/ 03 апреля 2019

Не пишите микро-тест самостоятельно, используйте JMH framework. Это гарантирует, что вы избежите распространенных ошибок, например многоуровневая компиляция.

В вашем коде:

Instant start = Instant.now(); 
algorithm.IntersectDocuments();
Instant end = Instant.now();
return Duration.between(start,end);

algorithm.IntersectDocuments() можно было бы оптимизировать, если бы у него не было побочных эффектов.

Обратите внимание, что Instant.now() использует System.currentTimeMillis() за сценой, что не подходит для расчета прошедшего времени .

2 голосов
/ 03 апреля 2019

Instant.now() будет использовать текущее время в миллисекундах.Копая код, который вы видите, он использует System.currentTimeMillis().Вместо вышеуказанного подхода вы можете использовать следующий код, где я использовал время в нано секундах.

static long IntersectDocumentsTime(AlgorithmInterface algorithm) {
    long start = System.nanoTime();
    algorithm.IntersectDocuments();
    long end = System.nanoTime();
    long durationInNanos = end - start;
    return durationInNanos;
}
...