如果将两个连续的 Linux 命令作为 shell 脚本运行,它们会有多少延迟?

如果将两个连续的 Linux 命令作为 shell 脚本运行,它们会有多少延迟?

我有两个命令 A 和 B。我想同时执行它们,但在 Linux 中唯一可行的方法是使用 &。也就是说,

$ A &
$ B

我不希望 0 延迟两个命令,但大约应该期望多少?以毫秒、微秒还是纳秒为单位?谢谢。

答案1

请注意,这个问题的答案取决于系统在特定时间的具体操作。例如:

  • 您正在使用什么内核调度程序(它们的延迟不同)
  • 您正在运行哪些进程(它们都在争夺时间,并且调度程序可能不会像您希望的那样尽早选择您的进程)

可能还有上千种其他原因。因此,自己运行这个测试。还请注意,以下内容可能在很多细微的方面都是错误的,因为我对如何获得最佳性能并不是很了解bashzsh严格来说,因为这是我的登录 shell)。


考虑到这一点,我设计了一种简单的方法来测试这一点。GNU date 有一种方法可以显示纳秒(是的,你没看错)。因此,要获取一堆数据,你需要做的就是:

get_starting_diff() {
    date +%N & date +%N
}

# 5,000 iterations is probably good enough statistically
for iteration in $(seq 1 5000); do
    get_starting_diff
done > times

这(除了咀嚼很多PID)生成 10,000 行文件,其中包含时间信息。然后,您可以使用以下 Python (v3.4) 脚本来了解您的平均时间差异:

def pairwise(iterator):
    "Takes an iterator and extracts sequential pairs from it"
    pair = []
    for item in iterator:
        pair.append(item)
        if len(pair) == 2:
            yield pair
            pair = []

diffs = []
with open('times') as data:
    for start1, start2 in pairwise(data):
        diffs.append(int(start2) - int(start1))

diffs.sort()
median = diffs[len(diffs) // 2]
mean = sum(diffs) / len(diffs)

print("The median difference is", median / 1000000, "milliseconds")
print("The mean difference is", mean / 1000000, "milliseconds")

在我的系统(Ubuntu 13.10,Linux 3.12.0-997-generic)上,这给了我:

The median difference is 1.077483 milliseconds
The mean difference is 3.680928442211055 milliseconds

答案2

您正在运行并行任务。不要假设它们将以什么顺序运行。它们可以按任何顺序运行。B 甚至可以在 A 开始之前运行完成。那么下次运行它时,您可能会得到完全不同的结果。

相关内容