JsPerf – co jest szybsze?

Nigdy nie byłem zbytnim świrem jeśli chodzi o wyciskanie ostatnich herców z procesora, jendak jsPerf jest bardzo fajnym narzędziem do benchmarkowania kodu Javascript i muszę przyznać, że sprawdzanie co jest szybsze (i dlaczego) czasem potrafi wciągnąć.

Zacząłem od retorycznego pytania, czy szybsze będzie jQuery, czy może querySelectorAll – natywna metoda zaimplementowana niedawno w nowoczesnych przeglądarkach?
W sumie to pytania nie jest tak naiwne jak mogłoby się wydawać. Byłem ciekaw, czy najnowsza wersja jQuery korzysta już z najnowszych bajerów? Okazało się, że jQuery jest dwukrotnie wolniejsze.

Potem postanowiłem napisać prosty kod, który potrafiłby użyć natywnej metody jeśli będzie dostępna, lub jQuery w innym przypadku. To rozwiązanie okazał się równie szybkie (w przypadku, gdy querySelectorAll jest dostępne).

Na końcu pomyślałem, że jednak opakowanie zestawu elementów w obiecie jQuery daje nam dodatkowe bajery i sprawdziłem, czy użycie querySelectorAll, a następnie wpakowanie tego do jQuery ma sens. Niestety nie ma ;).

Wniosek z tego taki, że dopukidopóki nie potrzebujesz bajerów jQuery – lepiej używać documentSelectorAll o ile jest dostępne…

Razem z jsFiddle można mając kilka minut spróbować pomysłów, które krążą nam go głowie. Zachęcam Was do tego samego – swoimi testami i przemyśleniami możecie się podzielić w komentarzach ;)

Immediately Invoked Function (IIF) w PHP

Bardzo fajnie jest móc w Javascript zrobić coś takiego:

(function(x){
 alert(x*2);
})();

Pozwala Ci to izolować zmienne w funkcji i spać spokojnie. Chciałbym móc zrobić coś takiego w PHP, od wersji 5.3 są domknięcia, więc teoretycznie powinno się dać.
Nie udało mi się jednak znaleźć tak zgrabnego rozwiązania. Jednak po kolei:

$myFunc = function() {
  echo "123";
};
$myFunc();

Jednak ciągle mamy tu zmienną $myFunc – istnieje ryzyko, że właśnie ją komuś nadpisujemy.

function inv($func){
  return $func();
}
inv(function(){ alert "123"; });

Już lepiej. Jednak chciałbym móc przekazać parametr(y) do mojej IIF. Dlatego finalna wersja mogłaby wyglądać tak:

function inv($func){
  $args = array();
  if(func_num_args() >1) {
    $args = func_get_args();
    unset($args[0]);
  }
  return call_user_func_array($func, $args);
}

$x = "global x";
inv(function($x){
  echo "=== inside";
  var_dump($x);
  $x = "local x";
  var_dump($x);
  echo "=== /";
}, $x);
var_dump($x);

Dzięki temu masz miło wyizolowaną zmienną $x i wszyscy są szczęśliwi. Taki mały Snippet of the day.

Tak z zupełnie innej beczki: znalazłem dziś w kodzie zmienną $Darek ;)