Korzystanie z stdout jest wolne

Całe życie byłem przekonany, że wypluwanie danych do stdout jest najszybszym sposobem prezentowania postępu działania aplikacji działającej w CLI. I dopiero parę dni temu, przez przypadek, dowiedziałem się, że grubo się myliłem.

Weźmy na warsztat prosty skrypt:

$start = microtime(true);

for($i = 0; $i < 1000000; $i++) {
    echo 'New line' . PHP_EOL;
}

$stop = microtime(true);

$totalTime = $stop - $start;

echo 'Execution time: ' . $totalTime . PHP_EOL;

Wykonanie w moim przypadku zajmuje ~6,5 s.

Podobny skrypt uruchomiłem niedawno przez przypadek w pracy, jednak zapomniałem odkomentować wyświetlania linii tekstu. Skrypt wykonał się… praktycznie od razu.

Zakomentujmy więc linię zawierającą echo 'New line' . PHP_EOL; . Po tym zabiegu wykonanie skryptu trwa ok. 0,16 s. Różnica jest więc ogromna.

Po chwilowym szukaniu informacji na ten temat, pomocny okazuje się jak zwykle wątek na stackoverflow. W skrócie: stdout nie jest przystosowany do przetwarzania dużej ilości informacji, natomiast „fenomen” zauważony przez pytającego (zapis na dysk jest szybszy od wyplucia danych do stdout) wynika z buforowania. Dodatkowo, są duże różnice pomiędzy poszczególnymi emulatorami terminala.

Na przyszłość będę więc oszczędniejszy w korzystaniu z stdout, zwłaszcza, gdy zależy na czasie.

Eclipse – utrata możliwości debugowania w trakcie używania Xdebug

Po poznaniu rozwiązania problem wydaje się być głupi, ale powstrzymał mnie skutecznie przez bardzo długi czas przed debugowaniem aplikacji w PHP z użyciem Xdebug.

Do sedna: jeżeli w trakcie debugowania nagle tracisz możliwość sterowania debuggerem (dezaktywują się przyciski od nawigowania po kodzie, itp.), ale sama aplikacja i sesja debuggera nadal działa (jesteś w stanie ją pomyślnie zakończyć), to prawdopodobnie Eclipse stracił focus na debugowanym przez Ciebie wątku. Stan taki pokazuje poniższy zrzut ekranu:

eclipse-xdebug-lost-focus

Co w takiej sytuacji? Wystarczy kliknąć na „Remote launch” w karcie „Debug” (u mnie jest to lewa górna część ekranu):

eclipse-xdebug-recovered-focus

Jak widać, przyciski do sterowania debuggerem są znów aktywne i można kontynuować tę sesję Xdebug.