Alternatywy
Alternatywa dla tego:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
byłoby coś takiego, używając wyraźnie obietnic:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
lub coś takiego, używając stylu przekazywania kontynuacji:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Oryginalny przykład
To, co robi twój oryginalny kod, to wstrzymanie wykonania i oczekiwanie na getQuote()
rozliczenie zwróconej przez niego obietnicy . Następnie kontynuuje wykonywanie i zapisuje zwróconą wartość do, var quote
a następnie drukuje ją, jeśli obietnica została rozwiązana, lub zgłasza wyjątek i uruchamia blok catch, który wyświetla błąd, jeśli obietnica została odrzucona.
Możesz zrobić to samo używając Promise API bezpośrednio, jak w drugim przykładzie.
Występ
Teraz do wykonania. Przetestujmy to!
Właśnie napisałem ten kod - f1()
podaje 1
jako wartość zwracaną, f2()
wyrzuca 1
jako wyjątek:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Teraz wywołajmy ten sam kod milion razy, najpierw f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
A potem przejdźmy f1()
do f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Oto wynik, który otrzymałem za f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Za to mam f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Wygląda na to, że możesz zrobić około 2 milionów rzutów na sekundę w jednym procesie jednowątkowym. Jeśli robisz więcej niż to, być może będziesz musiał się tym martwić.
Podsumowanie
Nie martwiłbym się takimi rzeczami w Node. Jeśli takie rzeczy są często używane, zostaną ostatecznie zoptymalizowane przez zespoły V8, SpiderMonkey lub Chakra i wszyscy będą podążać - nie jest tak, że nie jest zoptymalizowany jako zasada, po prostu nie stanowi problemu.
Nawet jeśli nie jest zoptymalizowany, nadal argumentowałbym, że jeśli maksymalizujesz swój procesor w Node, prawdopodobnie powinieneś napisać chrupanie liczb w C - między innymi do tego służą natywne dodatki. A może rzeczy takie jak node.native byłyby lepiej dostosowane do tego zadania niż Node.js.
Zastanawiam się, jaki byłby przypadek użycia, który wymaga rzucania tak wielu wyjątków. Zwykle zgłoszenie wyjątku zamiast zwracania wartości jest, no cóż, wyjątkiem.