У меня есть две команды A и B. Я хочу выполнить их вместе, но единственный возможный способ в Linux - это использовать &. То есть,

$ A &
$ B

Я не ожидаю 0 задержек двух команд, но приблизительно, сколько я должен ожидать? В миллисекундах, микросекундах или наносекундах? Благодарю.

2 ответа2

1

Обратите внимание, что любой ответ на этот вопрос будет зависеть от того, что именно система делает в любой момент времени. Например:

  • Какой планировщик ядра вы используете (их задержки различаются)
  • Какие процессы у вас запущены (все они конкурируют за время, и планировщик может не выбирать ваши процессы так рано, как вам хотелось бы)

И, вероятно, тысячи других вещей. По этой причине, запустите этот тест самостоятельно. Также обратите внимание, что следующее может быть неверным во многих тонких аспектах, поскольку я не очень разбираюсь в том, как получить максимальную производительность из bash (ну, строго говоря, zsh , поскольку это моя оболочка для входа).


Имея это в виду, я разработал простой способ проверить это. У даты GNU есть способ показать наносекунды (да, вы правильно прочитали). Таким образом, чтобы получить кучу данных, все, что вам нужно сделать, это:

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) приведет к созданию файла из 10000 строк с информацией о синхронизации. Затем вы можете использовать следующий скрипт 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
0

Вы запускаете параллельные задачи. Не делайте предположений о том, в каком порядке они будут работать. Они могли бежать в любом порядке. B может даже дойти до завершения, прежде чем начнется A. Тогда в следующий раз, когда вы запустите его, вы можете получить совершенно другие результаты.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .