Операторы JavaScript выполняются одновременно - PullRequest
1 голос
/ 13 июля 2011

Можем ли мы выполнить два разных оператора вместе?Предположим, что это два утверждения

x += 2*y;
y = 2*x+3*y;

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

Ответы [ 3 ]

3 голосов
/ 13 июля 2011

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

Но JavaScript не является одновременным, то есть все строки выполняются последовательно, даже когда вы выполняете обратный вызов. JavaScript работает в браузере в одном потоке.

2 голосов
/ 13 июля 2011

В общем, вы можете рассчитать общее изменение двух переменных и перейти к ним напрямую (при условии, что вы сделаете моментальный снимок значений, чтобы между ними не было реальной зависимости данных; знаете ли вы, что ряд микропроцессоров будет делатьэто автоматически, хотя только там, где в коде нет данных?).Используя ваш пример и придумав небольшой поддельный синтаксис:

somehowInParallelWithSnapshotOf(x,y) {
    x <== 1*x + 2*y;
    y <== 2*x + 7*y;
}

Но вы не можете сделать это в Javascript, так как язык не поддерживает прямой параллелизм.(Конечно, это имеет свои преимущества. С одной стороны, это значительно упрощает семантику кода, поэтому позволяет реализациям использовать такие хитрости за кулисами, если они могут доказать его правильность.) Это также было бы бессмысленно для чего-то, кактривиальный, как этот пример;В целом, при раскручивании дополнительных потоков требуется очень много накладных расходов, и, когда дело доходит до того, что оно того стоит, обычно очень трудно упростить выражения до такой степени, что вы можете сделать их безопасными.

0 голосов
/ 13 июля 2011

Как уже упоминалось, Javascript не обеспечивает параллельное / параллельное выполнение. Операторы выполняются последовательно, один за другим. Таким образом, когда два оператора переключаются, результат меняется. Вы можете разработать своего рода «параллельные» векторные операции:

function F(x, y) {
    return [x + 2*y, 2*x + 3*y];
}
var x, y;
[x, y] = F(1, 2);

Назначение кортежа [x, y] = ... работает только в некоторых современных браузерах, которые поддерживают Javascript 1.7 (например, Firefox, но не IE8). Другой возможностью было бы моделировать векторы по объектам:

function G(x, y) {
    return {x: x + 2*y, y: 2*x + 3*y};  // here, the statements can be switched
}
var z = G(1, 2);
// use z.x, z.y ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...