cassis icon indicating copy to clipboard operation
cassis copied to clipboard

Why is js() a function instead of a variable?

Open marcoos opened this issue 14 years ago • 5 comments

Shouldn't this:

function js() {
 return ("00"==false);
}

be replaced with this:

$js = ("00" == false);

This way, there would be less function calls and the "00"==false expression would only be evaluated once per script run.

marcoos avatar May 23 '11 19:05 marcoos

Two reasons offhand:

  1. to avoid dependency on global variables (especially in core functionality!)
  2. jitted/incremental interpreters (both JS & PHP) will cache the result of evaluating the function as always a fixed constant and thus from a performance perspective the result should be the same.

If you find actual performance differences/issues with the use of such a constant function, I'd be interested in seeing them.

tantek avatar May 25 '11 17:05 tantek

  1. Technically, in JS a "global function" is a global variable.

  2. That depends on the JIT, but I've done a JSPerf test just a moment ago: http://jsperf.com/cassis-fun-vs-var

In Firefox the variable is almost three times faster than function call, in Safari and Opera - almost twenty times faster. Or am I doing the test wrong? :)

marcoos avatar May 25 '11 18:05 marcoos

I just verified similar results with your test on my MacBook Air 11". That's quite the difference. Ok, will consider a change like this for v0.2 (working hard to wrap up last changes for v0.1). In particular I may use a slightly longer name (maybe $in_js) for the global variable to reduce likelihood of collision.

tantek avatar May 25 '11 18:05 tantek

I don't think this will work as a variable, since in PHP, global variables must be declared at the beginning of the function. For example, in order for a function to be able to see the $in_js variable, it would need to look like this:

function example() {
  global $in_js;
  if($in_js) {
    // javascript
  } else {
    // php
  }
}

The advantage of using the js() function is that functions are available in the global scope.

aaronpk avatar Sep 13 '15 15:09 aaronpk

Just switched to returning true or false depending on which comment-code path so that should be even faster (for any modern js jit / or PHP processors).

tantek avatar Nov 03 '16 01:11 tantek