Почему один и тот же код выполняется в разной среде выполнения? - PullRequest
0 голосов
/ 02 августа 2020
def insertsort(iterable) :
    global start_time
    start_time = time.time()
    for current in range(1,len(iterable)) : # iterable[0] is consdiered as resorted in the beginning
        current_value = iterable[current] # saving current value
        compare = current
        while 0 < compare and iterable[compare-1] > current_value : # finding out where to put the sorted current value
            iterable[compare] = iterable[compare-1] # this line in the while loop moves the elements not sorted
            compare -= 1 

        iterable[compare] = current_value # put current value into the right place that the while loop found out

    calruntime()
    print("--- %s seconds ---" % (time.time() - start_time))
    
    return(iterable)

runtime={}
def calruntime() :
    global runtime
    runtime.update({time.asctime() : time.time() - start_time})


for n in range(25) : # 25 tests
    data = [i for i in range(5000,0,-1)] # number of sample: 5000
    insertsort(data)

Я измерил время выполнения этого кода и обнаружил, что каждое время выполнения отличается, хотя все они одинаковы с одним и тем же вводом. (Без рандомизации)

Когда я сделал log это было примерно так.

Sun Aug  2 10:26:24 2020 : 4.42353892326355
Sun Aug  2 10:26:28 2020 : 4.32453989982605
Sun Aug  2 10:26:32 2020 : 4.24298882484436
Sun Aug  2 10:26:37 2020 : 4.3115057945251465
Sun Aug  2 10:26:41 2020 : 4.226868152618408
Sun Aug  2 10:26:45 2020 : 4.148167371749878
Sun Aug  2 10:26:49 2020 : 4.231259107589722
Sun Aug  2 10:26:54 2020 : 4.3146984577178955
Sun Aug  2 10:26:58 2020 : 4.167114019393921
Sun Aug  2 10:27:02 2020 : 4.247375965118408

Average : 4.263805651664734

Они различаются примерно от 4,14 до 4,42 со средним значением 4,26.

Различный диапазон составляет примерно 6% от среднего времени выполнения что я считаю значительным.

Я хочу знать, почему возникает эта разница, поскольку я запустил один и тот же код с одним и тем же вводом и получил разное время выполнения.

Я предполагаю, что это связано с тем, что компьютер назначает данные каждый раз по разным адресам, несмотря на один и тот же код.

Буду признателен за ответы заранее: D

Ответы [ 2 ]

1 голос
/ 02 августа 2020

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

0 голосов
/ 11 августа 2020

Трудно провести хорошее тестирование текущих систем. Мало того, что ОС, драйверы, службы и другие приложения взаимодействуют с интервалом времени, мы должны учитывать разрешение таймера и задержку. Вы, вероятно, думаете, что время выполнения детерминировано c: как вы только что продемонстрировали, это не очень. По крайней мере, если смотреть из программы. Можно вызвать детерминированное c поведение, но это нелегко. Рассказывая вам, как бы привлечь внимание к книгам. Пожалуйста, просто примите + - 6% как разумную меру. Если необходимо, начните тестирование, основываясь на количестве цифр желаемой точности (НЕ точности). Чтобы получить 3 девятки, оцените тысячи тестов и курс вероятности и статистики. Единственная причина вариации «адрес» почти наверняка не является существенной причиной! Только один пример возможного источника: предположим, что система подключена к TCP-IP. пакеты приходят случайным образом, драйвер прерывает, иногда отбрасывает пакет или буферы. тогда ваша программа возобновится. Множество вариаций этой идеи.

...