parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Тест не совсем корректен

moko 01.02 06:28

Он примерно эквивалентен такому:
^for[y](0;9){
  ^for[y](0;9999){
    $x{code}
  }
}
В этом случае, как и в случае ^case[DEFAULT]{} происходит сохранение кода для возможного последующего выполнения. При этом код привязывается к текущему контексту исполнения, в данном случае к методу main, и поэтому может быть собран сборщиком мусора только по завершению метода. В этот момент связь "рвется" и использование кода за пределами контекста вызовет ошибку "junction used outside of context".


Поэтому более жизненный тест выглядит например так:
@core[]
  $result[]
  ^for[y](0;9999){
#    ^if( true ){}
    ^switch[]{^case[DEFAULT]{}}
  }

@main[][result]
^for[y](0;9){
  ^core[]
  ^memory:compact[]
  $u[$status:memory]
  $console:line[$u.used]
}

./parser3 test.html 
360
528
532
844
848
844
1488
1488
1488
1488
Как видно, стало заметно лучше. С чем связано рост сейчас так сразу не скажу, но едва ли это утечка. Внутри core каждый раз копится массив из 10,000 указателей на привязанный код, но они освобождаются по завершению метода. Но да, ^if() в любом случае эффективнее ^switch, хотя едва ли в реальном использовании эта разница будет так заметна.