Я обнаружил странное поведение в nodejs / chrome / v8. Кажется, этот код:
var x = str.charCodeAt(5);
x = str.charCodeAt(5);
быстрее этого
var x = str.charCodeAt(5); // x is not greater than 170
if (x > 170) {
x = str.charCodeAt(5);
}
Сначала я, хотя, может быть, сравнение стоит дороже, чем фактический второй вызов, но когда содержимое внутри блока if не вызывает str.charCodeAt(5)
, производительность такая же, как и для одного вызова.
Почему это? Мое лучшее предположение - v8 оптимизирует / деоптимизирует что-то, но я понятия не имею, как точно понять это или как предотвратить это.
Вот ссылка на jsperf, которая хорошо демонстрирует это поведение, по крайней мере, на моей машине:
https://jsperf.com/charcodeat-single-vs-ifstatment/1
![jsperf](https://i.stack.imgur.com/pYU7l.png)
Справочная информация : Причина, по которой я обнаружил это, потому что я пытался оптимизировать чтение токена внутри babel-parser .
Я тестировал, и str.charCodeAt()
в два раза быстрее str.codePointAt()
, поэтому я могу заменить этот код:
var x = str.codePointAt(index);
с
var x = str.charCodeAt(index);
if (x >= 0xaa) {
x = str.codePointAt(index);
}
Но второй код не дает мне никакого преимущества в производительности из-за описанного выше поведения.