我想知道为什么这两个代码之间的执行时间有两倍的差异

问题描述 投票:0回答:1

在计算机体系结构课上,我了解到当用汇编语言执行“if”语句时,涉及到分支预测策略的使用。此外,还强调了分支预测的操作会产生巨大的成本。

为了进一步探讨这个概念,我创建了以下示例。我最初预计“if”语句的存在会导致执行时间更长。然而,令我惊讶的是,带有“if”语句的代码实际上执行得更快,并且执行时间相差近两倍(带有“if”的代码为 1.8 秒,而没有“if”的代码为 2.5 秒) ).

我考虑过这个问题,但无法查明执行时间相差近两倍的原因。对于我可能没有考虑到的方面的任何建议或见解,我将不胜感激。

import time

def without_if(x):
    arr = ["Zero","One", "Two", "Three", "Four", "Five"]
    return arr[x]

num_iterations = 10000000

start_time = time.time()
for _ in range(num_iterations):
    result = without_if(5)
end_time = time.time()

print(f"Result: {result}")
print(f"Execution time without if: {end_time - start_time}")
import time

def with_if(x):
    if x == 1:
        return "One"
    elif x == 2:
        return "Two"
    elif x == 3:
        return "Three"
    elif x == 4:
        return "Four"
    elif x == 5:
        return "Five"
    else:
        return "Unknown"

num_iterations = 10000000

start_time = time.time()
for _ in range(num_iterations):
    result = with_if(5)
end_time = time.time()

print(f"Result: {result}")
print(f"Execution time with if: {end_time - start_time}")

我将这些代码中的每一个执行了 10 次,在所有情况下,时间差始终保持在大约两倍。

我怀疑问题可能与编程语言有关,因此我将相同的代码转换为Java并执行它,但我仍然观察到执行时间一致的两倍差异。

python java assembly computer-science cpu-architecture
1个回答
0
投票

正如评论中提到的,您应该使用

timeit
函数来获取特定重复次数的执行时间。还创建元素的
list
,以便通过函数外部的
Without_if
进行访问:

from timeit import timeit


arr = ["Zero", "One", "Two", "Three", "Four", "Five"]
num_iterations = 10000000


def without_if(x):
    return arr[x]


def with_if(x):
    if x == 1:
        return "One"
    elif x == 2:
        return "Two"
    elif x == 3:
        return "Three"
    elif x == 4:
        return "Four"
    elif x == 5:
        return "Five"
    else:
        return "Unknown"


if __name__ == '__main__':
    print(f'Result without if {timeit(lambda: without_if(5), number=num_iterations)}')
    print(f'Result with if {timeit(lambda: with_if(5), number=num_iterations)}')

输出:

Result without if 0.9158157
Result with if 1.3290761
© www.soinside.com 2019 - 2024. All rights reserved.