Porównanie prędkości - proceduralne kontra OO w językach interpretowanych




W interpretowanych języków programowania, takich jak PHP i JavaScript, jakie są następstwa dzieje z podejścia obiektowego nad proceduralnego podejścia?


Konkretnie co szukam to lista rzeczy do rozważenia przy tworzeniu aplikacji internetowych i wybierając między podejściami Object Oriented i proceduralnych w celu optymalizacji nie tylko prędkość, ale także konserwacji. Przytoczone przypadki badawcze i testowe byłoby pomocne, jak również, jeśli wiesz o wszelkich artykułów odkrywania tego dalej.


Konkluzja: jak duża (jeśli w ogóle) jest wydajność hit naprawdę, gdy idzie z OO vs. proceduralnych w interpretowanym języku?
Może jestem szalony, ale obawy o prędkości w takich przypadkach przy użyciu języka interpretacyjny jest jak próbuje dowiedzieć się, jaki kolor pomalować szopy. Załóżmy nawet nie dostać się do idei, że ten rodzaj optymalizacji jest całkowicie przedwczesne.


Trafisz sedno, gdy powiedział: „konserwacji”. Chciałbym wybrać podejście, które jest najbardziej wydajne i najbardziej utrzymaniu. Jeśli trzeba przyspieszyć później, to nie przyjdzie od przełączania między proceduralne kontra obiektowego paradygmaty kodowania wewnątrz interpretowanym języku.
Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. Jest to dość szerokie, ale dam ci tak ogólną odpowiedź, jak tylko mogę.

**CTE ...**

* Są niezindeksowalne (ale mogą używać istniejących indeksów na obiektach, do których istnieją odwołania)
* Nie można mieć ograniczeń
* Są zasadniczo jednorazowe `VIEW` s
* Trwać tylko do momentu uruchomienia następnego zapytania
* Może być rekurencyjny
* Nie masz dedykowanych statystyk (polegaj na statystykach dotyczących podstawowych obiektów)

**#Temp Tables ...**

* Są prawdziwe zmaterializowane tabele, które istnieją w tempdb
* Może być indeksowany
* Może mieć ograniczenia
* Trwaj w życiu obecnego POŁĄCZENIA
* Może odwoływać się do innych zapytań lub podprocedur
* Masz dedykowane statystyki generowane przez silnik

Jeśli chodzi o użycie każdego z nich, mają bardzo różne przypadki użycia.Jeśli masz bardzo duży zestaw wyników lub musisz odwołać się do niego więcej niż raz, umieść go w tabeli `#temp` .Jeśli ma być rekurencyjny, jednorazowy lub po prostu dla uproszczenia logicznego, preferowany jest `CTE` .

Ponadto należy `CTE`**nigdy nie używaj do wykonania**.Prawie nigdy nie przyspieszysz przy użyciu CTE, ponieważ znowu jest to widok jednorazowy.Możesz zrobić z nimi kilka fajnych rzeczy, ale przyspieszenie zapytania nie jest jednym z nich. Czym JavaScript różni się od języka Java?
  

  
przeczytaj tutaj, jest fajnie wypunktowane
  

  
<https://www.java.com/pl/download/faq/java_javascript.xml> <p><strong>na podstawie moich własnych testów, <code>find().limit(1)</code> jest rzędami wielkości <em> szybciej </em> niż <code>findone()</code>.</strong></p><p>wystąpił błąd w dokumentacji mongodb lub błąd w <code>findone()</code>. <code>findone()</code> działa bardziej jak <code>find().limit(n)</code> gdzie n jest liczbą dokumentów, które zwróci zapytanie. zrozumiałem to, próbując dowiedzieć się, dlaczego moje proste zapytania były tak wolne!</p><p><strong>aktualizacja:</strong> odpowiedź inżyniera 10gen (mongodb):</p><blockquote> <p>dwa wykonywane zapytania są bardzo różne. zapytanie wyszukujące zwraca kursor, jest to zasadniczo scenariusz braku operacji, ponieważ żadne rzeczywiste dane nie są zwracane (tylko informacje o kursorze). jeśli wywołasz findone, w rzeczywistości zwracasz dane i zamykasz kursor. dokumenty powinny zdecydowanie być jaśniejsze :-)</p> </blockquote><p><strong>aktualizacja:</strong> rzeczywiście, jeśli dokument <code>find().limit(1)</code> zostanie pobrany, wydaje się, że rzędy różnicy prędkości prędkości znikają. ponadto nie mogłem odtworzyć głównej różnicy prędkości ze sterownikiem javascript mongodb. pierwotnie testowałem przy użyciu mongodb java.</p> Jeśli pracujesz jako wykonawca, powiedziałbym, że jest to 100% od twojego pracodawcy. Powiedz im, że osiągnięcie celów, które dla ciebie wyznaczyli, oznacza, że inne rzeczy, które twoim zdaniem powinny być uważane za cele, nie są robione; zapytaj ich, czy chcą dostosować twoje cele. Być może powiedzą Ci, abyś kontynuował swoją pracę, ponieważ Twój czas jest kosztowny i chcą jak najkorzystniejszej relacji jakości do ceny. 


Jeśli pracujesz jako pracownik, możesz mieć więcej swobody w planowaniu sukcesji (lub być może istnieje oczekiwanie, że już to robisz). Wciąż jednak poinformuj o tym kierownika lub menadżera swojego zespołu, ponieważ muszą oni wiedzieć o problemie i o tym, jak Ty się czujesz i jak powinieneś się zachowywać. 


Kilka rzeczy, które mogłyby pomóc w planowaniu sukcesji: 


* Codzienne procesy powinny być w pewnym stopniu udokumentowane, ale jest prawdopodobne, że inni ludzie w Twoim zespole stosują te same procesy i mogą nauczyć ich nowego pracownika. Jeśli nie wszyscy używają podobnych procesów, to jest to aktualny problem, który powinien być rozwiązany; zbierzcie się, przedyskutujcie, który sposób jest najlepszy, przyjdźcie do jakiegoś standardu (za zgodą lub pod przymusem z góry) i użyjcie standardu, gratulacje, które standard może znaleźć się w dokumentacji dla nowicjusza.
* Ważne rzeczy, które są przekazywane za pomocą poczty elektronicznej, spotkań, lub przypadkowych rozmów, muszą zostać przekształcone we wspólny zasób, wszystko od folderu dokumentów na wspólnym dysku do wiki. Istnieje to dziwne przekonanie (przynajmniej tam, gdzie pracowałem), że jeśli coś zostanie przesłane pocztą elektroniczną do wszystkich członków zespołu, to na zawsze będzie to wiedzieć; nie bierze to pod uwagę tego, że skład zespołu się zmienia i że jakiekolwiek szkolenie (jeśli w ogóle się odbędzie) nigdy nie przekaże całej wiedzy, tylko podzbiór często używanej wiedzy.
* (Możliwe, że specyficzny dla oprogramowania) Dokumentuj wyraźnie przeciwintuicyjne procesy lub decyzje projektowe, ważne jest, aby określić, że proces jest uznawany za przeciwintuicyjny i dlaczego tak jest, niezależnie od tego. Na przykład, jeśli Twój klient poprosił Cię o zrobienie czegoś, co wydaje się "nieprawidłowe" ("Nie jestem ekspertem w dziedzinie, ale czy jesteś pewien, że chcesz to zrobić?"), a Ty wyjaśniłeś, dlaczego uważasz, że to było nieprawidłowe i potwierdziłeś, że to było to, czego chciał (jeszcze lepiej, jeśli wyjaśniłeś dlaczego), to należy udokumentować powody, dla których uważałeś, że to było nieprawidłowe i wyjaśnić, dlaczego to było prawidłowe. Że funkcje oprogramowania według specyfikacji nie wystarczą do zastąpienia, będą miały to samo pytanie, co Ty.
* Dla każdego problemu, który napotkasz, a którego rozwiązanie wymaga dużo czasu/badań, dokumentuj problem, objawy, skróconą drogę do rozwiązania (tj.: wiedząc to, co wiesz teraz, jaka była najszybsza droga od rozpoznania objawów do rozwiązania), i rozwiązanie. Objawy są naprawdę ważne dla Twojego zastępstwa, ponieważ uderzą w nie zanim w pełni zrozumieją problem.
* Poprzedni punkt jest jeszcze ważniejszy w odniesieniu do starszych systemów, takich jak biblioteki czy platformy, gdzie nowe wersje są wydawane, ale nie używane w Twoim produkcie. Problemy, które napotkasz w swojej wersji (lub, co gorsza, w interakcjach pomiędzy kilkoma starszymi systemami) mogą zostać rozwiązane w przyszłych wersjach, a więc samo istnienie wady zniknie z publicznej wiedzy, aż do momentu, w którym znalezienie informacji o niej będzie prawie niemożliwe. teram na pewno znajdę łatwiejszy sposób. zobaczę czy nie będzie działać na stronach wyświetlających pagge speed z vpn jakie ładuje obraz strony. zmienię ustawienia językowe przeglądarek bo daliście mi na to pomysł + vpn. lub skorzystam z tunelowania przeglądarki wirtualnej. 
ale jest już postęp bo j… <h1><strong> nr. </strong></h1><p><strong> <code>truncate</code> i <code>drop</code> są prawie identyczne pod względem zachowania i prędkości, więc wykonanie <code>truncate</code> tuż przed <code>drop</code> jest po prostu niepotrzebne. </strong></p><hr><p><em>waga: napisałem tę odpowiedź z perspektywy sql server i założyłem, że będzie ona miała zastosowanie w równym stopniu do sybase. wygląda na to, że <a href="https://dba.stackexchange.com/q/186154/2660">nie jest tak do końca</a> .</em></p><p><em>waga: kiedy po raz pierwszy opublikowałem tę odpowiedź, było kilka innych wysoko ocenianych odpowiedzi - w tym również odpowiedź zaakceptowana - które złożyły kilka fałszywych twierdzeń, takich jak: <code>truncate</code> nie jest rejestrowany; <code>truncate</code> nie można przywrócić; <code>truncate</code> jest szybszy niż <code>drop</code>; itp.</em></p><p><em>teraz, gdy ten wątek został oczyszczony, następujące obalenia mogą wydawać się styczne do pierwotnego pytania. zostawiam je tutaj jako odniesienie dla innych, którzy chcą obalić te mity.</em></p><hr><p>istnieje kilka popularnych kłamstw - rozpowszechnionych nawet wśród doświadczonych dba - które mogły być tego powodem <code>truncate-then-drop</code> wzór. oni są:</p><ul> <li><strong> mit </strong>: <code>truncate</code> nie jest rejestrowany, dlatego nie można go przywrócić.</li> <li><strong> mit </strong>: <code>truncate</code> jest szybszy niż <code>drop</code>.</li> </ul><p>pozwól mi obalić te kłamstwa. piszę to obalenie z perspektywy sql server, ale wszystko, co tu powiem, powinno mieć również zastosowanie do sybase.</p><h1> <a href="http://msdn.microsoft.com/en-us/library/ms177570.aspx"> obciąć </a> <em>is</em> zalogowany, a <em>can</em> można przywrócić.</h1><ul> <li> <p><strong> <code>truncate</code> jest zarejestrowaną operacją, więc <a href="http://sqlblog.com/blogs/kalen\_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx">to <em>można</em> wycofać</a> . </strong> po prostu zawiń to w transakcji.</p> <pre><code>use [tempdb]; set nocount on; create table truncate\_demo ( whatever varchar(10) ); insert into truncate\_demo (whatever) values ('log this'); begin transaction; truncate table truncate\_demo; rollback transaction; select * from truncate\_demo; drop table truncate\_demo; </code></pre> <p>zauważ jednak, że <strong> jest to <a href="http://psoug.org/reference/truncate.html">nieprawda</a> dla oracle </strong>. chociaż zalogowany i chroniony przez funkcję cofania i ponawiania oracle, <code>truncate</code> i inne instrukcje ddl <em>nie można</em> zostać wycofane przez użytkownika, ponieważ oracle wydaje <a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11\_question\_id:2860243091362">niejawne zobowiązania</a> natychmiast przed i po wszystkich instrukcjach ddl.</p> </li> <li> <p><strong> <code>truncate</code> jest minimalnie zalogowany </strong>, a nie w pełni zalogowany. co to znaczy? powiedzmy, że <code>truncate</code> stół. zamiast umieszczać każdy usunięty wiersz w dzienniku transakcji, <code>truncate</code> po prostu zaznacza strony danych, na których żyją, jako nieprzydzielone. właśnie dlatego jest tak szybki. dlatego też nie można odzyskać wierszy tabeli <code>truncate</code> z dziennika transakcji przy użyciu czytnika dziennika. znajdziesz tam tylko odniesienia do stron zwolnionych danych.</p> <p>porównaj to z <code>delete</code>. jeśli <code>delete</code> wszystkie wiersze w tabeli i zatwierdzisz transakcję, nadal teoretycznie możesz znaleźć usunięte wiersze w dzienniku transakcji i odzyskać je stamtąd. jest tak, ponieważ <code>delete</code> zapisuje każdy usunięty wiersz w dzienniku transakcji. w przypadku dużych tabel spowoduje to, że będzie on znacznie wolniejszy niż <code>truncate</code>.</p> </li> </ul><h1> <a href="http://msdn.microsoft.com/en-us/library/ms173790.aspx"> upuść </a> jest równie szybki jak truncate.</h1><ul> <li>podobnie jak <code>truncate</code>, <strong> <code>drop</code> jest operacją minimalnie rejestrowaną. </strong> oznacza to, że <code>drop</code> można wycofać też. oznacza to również <a href="http://msdn.microsoft.com/en-us/library/dd425070.aspx">działa dokładnie tak samo</a> jak <code>truncate</code>. zamiast usuwać poszczególne wiersze, <strong> <code>drop</code> oznacza odpowiednie strony danych jako nieprzydzielone i dodatkowo oznacza metadane tabeli jako usunięte </strong>.</li> <li> <p>ponieważ <code>truncate</code> i <code>drop</code> działają dokładnie w ten sam sposób, działają tak samo szybko. <strong> nie ma sensu <code>truncate</code> - przechodzenie do tabeli przed <code>drop</code> - pisanie jej. </strong> uruchom <a href="https://gist.github.com/1349319">this skrypt demo</a> w twojej instancji programistycznej, jeśli mi nie wierzysz.</p> <p>na mojej lokalnej maszynie z ciepłą pamięcią podręczną wyniki są następujące:</p> <pre><code>table row count: 134,217,728 run# transaction duration (ms) truncate truncate then drop drop  01 0 1 4 02 0 39 1 03 0 1 1 04 0 2 1 05 0 1 1 06 0 25 1 07 0 1 1 08 0 1 1 09 0 1 1 10 0 12 1  avg 0 8.4 1.3 </code></pre> <p>tak więc, dla tabeli 134 <em>milionów</em> wierszy, zarówno <code>drop</code>, jak i <code>truncate</code> nie zajmują w ogóle czasu. (w przypadku zimnego bufora zajmują około 2-3 sekund dla pierwszego uruchomienia lub dwóch). uważam również, że wyższy średni czas trwania operacji <code>truncate</code>, a następnie <code>drop</code>, można przypisać zmianom obciążenia na moja lokalna maszyna i <em>nie</em>, ponieważ kombinacja jest w magiczny sposób o rząd wielkości gorsza niż poszczególne operacje. w końcu są prawie dokładnie tym samym.</p> <p>jeśli interesują cię bardziej szczegółowe informacje na temat narzutu związanego z logowaniem tych operacji, <a href="https://dba.stackexchange.com/questions/4163/why-use-both-truncate-and-drop/7685#7685">martin ma proste wyjaśnienie</a> tego.</p> </li> </ul> to jest powershell. jest czytelniejszy po prostu. 
natomiast w cmd, jeżeli uzywasz zmiennych w *.cmd, a nie interaktywnie, musisz podwoić procenty. o tak: 
for %%f in (*.log) do if %%~zf==0 del "%%f" Jeśli uczysz się języka od podstaw to lepiej uczyć się wolno. Jeśli będziesz uczyć się zbyt szybko to będziesz miała wrażenie, że już coś umiesz ale prawdopodobnie będzie to tylko w pamięci krótkotrwałej.
Jeśli już trochę znasz język (ze szkoły) to możesz szybciej przerabiać materiał. Rzetelna firma oferująca oprogramowania charakteryzuje się kompetencjami,
które dokumentuje w postaci zdobytego doświadczenia na swojej stronie internetowej.
Krótko mówiąc, przedstawia zrealizowane projekty i stopień zadowolenia klientów
z realizacji. Ważny jest również elastyczny model współpracy – otwartość firmy
na oczekiwania i wytyczne klienta na każdym etapie prac, a także udzielanie wsparcia
po zakończeniu projektu.