9. МАССИВЫ
"Плотные" (dense) массивы – ОК
"Разреженные"(sparse) массивы – BAD
Разные типы в массиве – BAD
"дырки" в массиве – BAD
index iteration – ОК
функциональный стиль или for..in – BAD
10. МАССИВЫ
// dense array
var a = [];
for (var i = 0; i < 1000; i++) {
a[i] = i;
}
// sparse array
var a = [];
a[100000] = 0;
for (var i = 0; i < 1000; i++) {
a[i] = i;
}
11. МАССИВЫ
// indexed iteration
for (var i = 0; i < a.length; ++i) {
sum += a[i];
}
// functional style
even = a.filter(function(item) { return item % 2 == 0; });
// for..in
for (var i in a) {
a[i] += i;
}
12. ФУНКЦИИ
fun.call() – BAD
fun.apply() – BAD
arguments – OK
полиморфные функции – BAD
мономорфные функции – OK
closures – зависит от объекта функции
13. ОБЪЕКТЫ
Создание объектов – ОК
Object.create – BAD
OOP через prototype – OK
OOP через closure – BAD
Копирование больших объектов – BAD
conditional proprety assignment – BAD
delete property – BAD
14. ОБЪЕКТЫ
function Example(a, b) {
this.a = a;
this.b = b;
if ((a + b) % 2) {
// anti-pattern. different hidden classes
this.c = a + b;
}
}
var a = new Example(1, 2);
var b = new Example(2, 3);
// anti-pattern. different hidden classes
// declare it in the constructor
b.z = "aaa";
15. ОБЩИЕ СОВЕТЫ
Избегайте eval и with
Избегайте try/catch/throw
type safe код
OOP через closure – BAD
Копирование больших объектов – BAD
16. V8 PROFILER
Просмотр стека JavaScript и C/C++ кода;
* – оптимизированная функция
~ – деоптимизированная функция
$ ./out/ia32.release/d8 ~/temp/test.js --prof
$ tools/mac-tick-processor
Statistical profiling result from v8.log, (203 ticks, 1 unaccounted,
[Shared libraries]:
ticks total nonlib name
[JavaScript]:
ticks total nonlib name
21 10.3% 10.3% LazyCompile: *<anonymous> /Users/Neurostep/tem
15 7.4% 7.4% LazyCompile: STRING_ADD_RIGHT native runtime.j
6 3.0% 3.0% Stub: CompareICStub
</anonymous>
17. IR + DISASSEMBLED
CODE
Сгенерированный код промежуточного представления можно посмотреть
через
$ ./out/ia32.debug/d8 --trace-hydrogen --print-opt-code --code-comments
C1Visualizer