- PHP
- MySQL
- productivitate
- Node.js
- Dezvoltare web
Există un sistem bazat pe web (php + mysql pe xampp) în rețeaua locală. În sistem, câteva sute de utilizatori. În sistem, numărul de înregistrări din baza de date crește foarte rapid. În același timp, creșterea frânării și creșterea utilizării procesorului serverului. Am început să săpat în căutarea unui gâtuire. Nu vă voi da întregul lanț de săpătură. Ca urmare a săpării, acesta este modul în care:
Am pus xampp-ul pe PC-ul meu (core i7, 8Gb RAM, Win7 Ultimate). Puneți serverul node.js pe PC.
Fac de la PHP referința la un mysql DB.
Există 5000 de înregistrări în tabelul dreg_document. Eu le aleg într-un ciclu de 1000 de ori. Acest cod funcționează timp de 3,5 secunde.
(DOP nu poate fi folosit din anumite motive, deci acest cod).
Fac aceeași manipulare de la serverul node.js
DAR! Iterațiile sunt de 100 de ori mai mari. Acest cod funcționează timp de 1,4 secunde.
Mai departe. Din browser deschid conexiunea websocket și solicit serverului node.js să execute scenariul de mai sus. Implementarea clientului (firefox browser):
Acest cod funcționează timp de 2 secunde. Asta este, răspunsul de la server la browser vine în 2 secunde. (și asta este tot la 100 mii iterații)
În node.js folosesc următoarele module:
Î: Driverul pentru mușchi 150 (!) Times mai rapid decât PHP-shnogo? Sau nu testez corect? Dacă acesta din urmă, spune-mi cum să testez corect.
Eu însumi nu pot să cred că node.js cu un șofer scrise acum câțiva ani este de sute de ori mai rapid decât php, pe care se află atât de mulți oameni și care este constant actualizat etc.
P.S. DOP testate. Și mai lent
ZY 2
A protestat încă. Nu plânge. Pentru 1000 iterații:
mysql_ * pentru 3,4 secunde
DOP în 6,67 secunde
mysqli pentru 6,68 secunde.
Ei bine, atunci. Vă mulțumim pentru răspunsuri. Am înțeles ce sa întâmplat. pentru că Am programat pentru node.js la fel de mult ca 2 săptămâni, am interpretat greșit rezultatele. Modificat testul și acest lucru sa întâmplat:
Dacă vă gândiți la php-shnomu, după ce ați elaborat toate solicitările, este trimis un mesaj clientului -
client.send ('qwerty');
Dar, de fapt, mesajul este trimis atunci când serverul nod trimite toate cererile către baza de date. Apoi (! Fără a aștepta un răspuns din baza de date), serverul trimite un mesaj clientului. Clientul (browserul) calculează timpul (sa dovedit, de exemplu, 2 secunde pentru 100.000 de iterații). Și în acest moment în nod continuă să primească răspunsuri din baza de date. Vedem aceste răspunsuri folosind
console.log (str);
Și aici sunt deja rezultate destul de diferite.
Apoi, vom schimba script-ul după cum urmează pentru a calcula timpul de execuție de la prima la ultima conexiune asincronă la baza de date:
rezultat
Pentru 100 iterații de 2,5 secunde (care este de 15 ori mai lent decât în PHP)
Răspuns intermediar la subiectul:
Node.js nu este mai rapid decât PHP de 150 de ori în ceea ce privește accesul la baza de date.
Dimpotrivă, Node.js din acest plan este de 15 ori mai lent decât PHP.
(aceasta este dacă scoateți ambele servere din cutie, fără îmbunătățiri și setări)
O nouă întrebare:
Ultimul meu test este corect? Sau fac și eu ceva în neregulă?
Pentru a obține ceea ce doriți să obțineți, codul ar trebui să fie ceva de genul:
/ * ÎNCEPUTUL NODE CODULUI * /
var ITERĂRI = 1000;
var async = necesită ('async');
var mysql = necesită ('mysql');
var conexiune = mysql.createConnection (gazdă "localhost",
utilizator. 'Root',
parola. 'Secret',
bază de date. „Testul“
>);
console.time ('node.js');
async.times (ITERATIONS, funcția (n, următoarea) connection.query ("SELECT * FROM test", funcția (err, rezultat) următorul (err, rezultat);
>);
>, funcția (eroare, rezultate) dacă (err) aruncă o nouă eroare (err);
console.timeEnd ('node.js');
console.log ('rezultate:', results.length);
connection.end ();
>);
/ * END OF CODUL NODE * /
Am 1000 de interogări returnate 1000 de rezultate pentru 320 milisecunde (MariaDB).
Verificați baza de cod în baza mea de date și raportați rezultatul. Nu uitați să puneți modulul async, pe care îl recomand foarte mult pentru dvs., deoarece judecând după ciclurile FOR în codul dvs. nu știți despre el.