![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 116 Pomógł: 119 Dołączył: 10.05.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Proponuję podzielić się pomysłami na szybkie optymalizacje kodu za pomocą sztuczek: na początek:
podobnie:
trochę z innej beczki:
lub
.. macie jakieś sztuczki, którymi chcecie się podzielić? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 23 Pomógł: 2 Dołączył: 26.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam, Proponuję podzielić się pomysłami na szybkie optymalizacje kodu za pomocą sztuczek: na początek:
Zaraz, zaraz... Przecież powyższe konstrukcje sprawdzają coś innego. in_array sprawdza, czy istnieje wartość 'honda' w tablicy $cars, a isset sprawdza czy istnieje element tablicy $cars o kluczu 'honda'. To nie jest to samo (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Sam temat uważam za ciekawy, niestety w chwili obecnej nie mam za wiele czasu, aby wprowadzić (i pomyśleć, czy takie mam (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) własne sztuczki, ale na pewno będę go pilnie śledził (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 116 Pomógł: 119 Dołączył: 10.05.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Ups... fakt, pospieszyłem się trochę (a miało to być zachęcenie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )
powinno być:
inne przykłady, oczywiście lepiej
zamiast
lub
Ten post edytował Cezar708 30.11.2007, 12:02:36 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 1 Dołączył: 19.09.2003 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
We wcześniejszym poście piszesz o używaniu ++$i zamiast $i++, a w tym przykładzie nadal używasz $i++. Trochę konsekwencji (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 33 Pomógł: 1 Dołączył: 8.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
mozesz to zapisac jeszcze krocej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 116 Pomógł: 119 Dołączył: 10.05.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
We wcześniejszym poście piszesz o używaniu ++$i zamiast $i++, a w tym przykładzie nadal używasz $i++. Trochę konsekwencji (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Szczerze mówiąc zainteresowało mnie, czy czasem parser sam nie optymalizuje takiej pętli. Okazało się, że tak (z resztą sam sprawdziłem), czyli:
oczywiście zasada ta nie dotyczy pre- i postinkrementacji w samym kodzie |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 475 Pomógł: 0 Dołączył: 1.04.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
mozesz to zapisac jeszcze krocej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Tylko tutaj własnie chodzi by obliczać to przed pętlą (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Wtedy skrypt nie musi za każdym razem używać count. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
a skad masz takie informacje? Tak z ciekawości pytam bo nie wydaje mi sie żebyś miał racje, ale nie zagłębiałem sie w działanie parsera php wiec moge sie mylić |
|
|
![]()
Post
#9
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
a skad masz takie informacje? Tak z ciekawości pytam bo nie wydaje mi sie żebyś miał racje, ale nie zagłębiałem sie w działanie parsera php wiec moge sie mylić To jest logiczne. Wynika z semantyki powyższych wyrażeń. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wcale z tego nie wynika, drzewo budowane jest na podstawie wyrażeń pasujących leksemów napotkanych przez parser w trakcie analizy. To czy jest post czy pre inkrementacja nie zmienia tutaj nic oprócz zapisu w drzewie i żadne tymczasowe zmienne nie są tworzone. Poza tym w każdym z języków programowania obie te operacje odbywają w czasie 1u i są niepodzielne. No wiec dlatego spytałem skąd takie informacje masz pokaż źródło prosze
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 345 Pomógł: 3 Dołączył: 20.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
Czyżby temat zaczerpnięty z http://www.jarzebski.pl/read/optymalizacja-php.so ?
|
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Tylko tutaj własnie chodzi by obliczać to przed pętlą winksmiley.jpg Wtedy skrypt nie musi za każdym razem używać count. To, ze count() jest w for nie znaczy ze jest za kazdym razem wyliczane. Polecam lekture manuala. Wszystko zalezy w ktorym miejscu tego for jest (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Cytat Czyżby temat zaczerpnięty z http://www.jarzebski.pl/read/optymalizacja-php.so ? Rownie dobrze mozna powiedziec ze twoj link plagiatuje ten: http://blog.i64.pl/BlogPio/200611/30-optymalizacja-kodu-php/No, przyznawać sie, kto od kogo bierze? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
a ja dodam to (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) po to chyba ten wątek był profilowanie
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 505 Pomógł: 0 Dołączył: 8.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
@Nospor : do podejrzanych należy dodać :
http://ilia.ws/archives/12-PHP-Optimization-Tricks.html http://reinholdweber.com/?p=3 i pewnie jeszcze kilkunastu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) bo to tylko wierzchołek góry lodowej Google |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 33 Pomógł: 1 Dołączył: 8.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
Tylko tutaj własnie chodzi by obliczać to przed pętlą (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Wtedy skrypt nie musi za każdym razem używać count. zwroc uwage ze NIE podalem tego w postaci
tylko
gdzie wartosci zmienne $i=0, $count sa wyliczane jeden raz przed rozpoczeciem petli |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
++$i:
miejsce w pamięci najpierw jest inkrementowane a potem jego wartość zwracana $i++ najpierw tworzona jest kopia zmiennej i celem zapamietania wartości przed inkrementacją, faktyczna zmienna i jest inkrementowana (tracony czas pamiec na stworzenie kopii zmiennej) $x = ++$i; (doda 1 i zwroci wynik po dodaniu - raz dodaje, raz zwraca) $x = $i++ (stworzy kopie $i, zwroci jej wartosc do $x, potem dopiero doda 1 - zwiekszy chwilowo zuzycie pamieci i zabierze takt(y) procesora na stworzenie kopii $i);
Najkrocej napisane i najbardziej optymalne (a nie chcac nic pominac proponuje rowniez zadeklarowac zmienne $i i $count zebybyly odpowiedniego typu, np. jak $arr ma 200 kluczy to lepiej typ unsigned char niz domyslny int) Ten post edytował prgTW 1.12.2007, 14:59:04 |
|
|
![]()
Post
#17
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Aaa, sorry, siedze i pisze program w c++ i stąd ta pomyłka. PHP ma dynamiczny typ danych, więc sorki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 345 Pomógł: 3 Dołączył: 20.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Rownie dobrze mozna powiedziec ze twoj link plagiatuje ten: http://blog.i64.pl/BlogPio/200611/30-optymalizacja-kodu-php/ No, przyznawać sie, kto od kogo bierze? Ale spójrz, w podanym przeze mnie linku mamy 3 przykłady, które są identyczne jak w tym temacie. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Co innego w przykładzie, który ty podałeś. (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
++$i: miejsce w pamięci najpierw jest inkrementowane a potem jego wartość zwracana $i++ najpierw tworzona jest kopia zmiennej i celem zapamietania wartości przed inkrementacją, faktyczna zmienna i jest inkrementowana (tracony czas pamiec na stworzenie kopii zmiennej) $x = ++$i; (doda 1 i zwroci wynik po dodaniu - raz dodaje, raz zwraca) $x = $i++ (stworzy kopie $i, zwroci jej wartosc do $x, potem dopiero doda 1 - zwiekszy chwilowo zuzycie pamieci i zabierze takt(y) procesora na stworzenie kopii $i); nie no prosze Cie ..... wiesz co to architektura komupterów, prof. Biernat i sumator? podaj fakty dlaczego i gdzie tak napisane. - jak napisałem te operajce da sie wykonać w 1 takcie cyklu procesora, myle sie ? - jedyny problem może wynikać z budowy drzewa parsera ale to zaraz na google znajde moze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował sticker 2.12.2007, 01:53:47 |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
$count1 to ilość szybszych preinkrementacji $count2 to ilość szybszych postinkrementacji //edit: xdebug_time_index() to coś jak array_sum(microtime()); //edit2: oops, byl blad w ilosci iteracji: Przykładowe wyniki, już poprawne: 751 - 249 742 - 258 752 - 248 766 - 234 754 - 246 Ten post edytował prgTW 2.12.2007, 02:04:49 |
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
manual php w komentarzach mówi że http://php.oregonstate.edu/manual/en/language.operators.increment.php" title="Zobacz w manualu PHP" target="_manual pre jest szybsza,
pan google mówi że w jezykach po kompilacji nie ma różnicy bo to na poziomie procesora przesunięcie bitowe tylko a w którą strone to juz wsio ryba, @prgTW to nadal nie wyjaśniało nic tylko eksperyment ja chce faktów :) edyta mówi @prgTW czyli widać że nie można przyjąc testów z testów co jest szybsze bo 66-33 % za duży margines w sumie i tak nie ma co sie kłócić przy milionie operacji to jest zysk 0.1 ms :] czy jakos tak Ten post edytował sticker 2.12.2007, 02:08:33 |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
A od kiedy PHP jest językiem kompilowanym?
edit: A czy przesunięcia bitowe to nie są czasem operatory najszybszego mnożenia i dzielenia przez 2, a nie dodawania i odejmowania (inkrementacji i dekrementacji) ? 0.1ms przy milionie wywołań na sekundę moim zdaniem robi różnicę, u mnie widać widoczną różnicę na 10tyś iteracji! Ten post edytował prgTW 2.12.2007, 02:11:04 |
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
a czy ja napisałem ze jest? nie wydaje mi się
fakt masz racje.. moj błąd |
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście że nie, tylko nie ma sensu pisać o językach kompilowanych jak PHP jest językiem interpretowanym w czasie rzeczywistym. Proces kompilacji jest skomplikowany, często optymalizowany kilka razy, a tutaj mamy do czynienia z ptasim mózgiem generalnie, który wątpię żeby przeprowadzał optymalizację przy wywołaniu, chociaż mogę się mylić, nie jestem współtwórcą php
Co do testów - chciałem tylko pokazać że różnica jest ... i to widoczna ... i to bardzo, więc nikt mi nie wmówi, że postinkrementacja jest równie szybka jak pre, nie chciałem się kłócić, pokój z Tobą (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował prgTW 2.12.2007, 02:15:59 |
|
|
![]()
Post
#26
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
możesz dla testów puścic 100k i dać wyniki czasowe róznicy? to juz tak z ciekawości
|
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
troche potrwa ale wrzuce te 100k elementarnych iteracji
|
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
oak zrobiłem testa dla 100k
pre - post 0.0509519577026 - 0.0553870201111 nie wiem czy gra warta świeczki, bo rzadko zdarza sie serwis który ma 1000 hitów na sekunde wąskiego gardła trzeba szukać gdzie indziej |
|
|
![]()
Post
#29
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dla 10,000 iteracji i 1,000 pętli (10,000,000 obliczeń) Wynik na plusie oznacza że postinkrementacja jest wolniejsza (poniższe wartości to różnice czasowe) float 0.00971746444702 float 0.124341726303 float 0.105871200562 float 0.0391747951508 float 0.0849807262421 //edit: Dla 100,000 iteracji i 1,000 petli (100,000,000 obliczeń): float 0.449510574341 float 0.493491411209 float 0.503324985504 float 0.575709104538 float 0.55215716362 Ale sprawdzenie czy liczba jest parzysta bez zatrudniania procesora do wykonywania dzielenia (co jest dla niego najgorszym działaniem chyba) operując na bitach mi się bardzo podoba, o wiele szybsze (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Ten post edytował prgTW 2.12.2007, 02:43:43 |
|
|
![]()
Post
#30
|
|
Grupa: Zarejestrowani Postów: 255 Pomógł: 5 Dołączył: 20.03.2007 Skąd: Kraków Ostrzeżenie: (30%) ![]() ![]() |
Ok. To ja mam dla was zadanie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Kto najlepiej zoptymalizuje funkcje my_sort dostanie buzi (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)
U mnie to zwraca czas okolo 2.0 sekundy (1.9 do 2.1). Jakie macie pomysly? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował domis86 3.12.2007, 04:43:42 |
|
|
![]()
Post
#31
|
|
Grupa: Zarejestrowani Postów: 1 116 Pomógł: 119 Dołączył: 10.05.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
hmm zastanowiło mnie to i zrobiłem kilka testów:
Test 1:
output: Kod $h++, czas: 17.7393829823 ++$h, czas: 16.5931489468 Czyli jak widać minimalnie szybszy jest ++$h, (oczywiście testy powtarzałem, wynik relatywnie zawsze był taki sam) Test2:
output: Kod $h++, czas: 19.8630981445 ++$h, czas: 24.9836299419 czyli ++$h jest zdecydowanie wolniejszy... (oczywiście tu również testy powtarzałem, i wyniki zawsze były relatywnie takie same) Wniosek, jeśli robimy zwykłą incrementację to lepiej użyć pre-. Natomiast jeśli przepisujemy to zdecydowanie lepiej $h++. I wiem, że w przypadku post-incrementacji przypisanie jest najpierw (a potem incrementacja), ale to i tak jest w pętli, więc wynik myślę, że nie jest przekłamany. Oczywiście jeśli macie jakieś inne zdanie to proszę o komentarz. Nie wiem jak Was, ale mnie wyniki zaskoczyły. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jeśli chodzi o spekulacje na temat tego skąd ukradłem ten temat powiem, że szukałem czegoś o takich sztuczkach na tym forum i nie znalazłem. Dlatego zacząłem szukać w googlu. Znalazłem kilka ciekawych, ale chciałbym się dowiedzieć, czy jeszcze jakieś znacie, dlatego rozpocząłem ten temat i nie uważam tego za jakieś przestępstwo. Pozdrawiam |
|
|
![]()
Post
#32
|
|
Grupa: Zarejestrowani Postów: 255 Pomógł: 5 Dołączył: 20.03.2007 Skąd: Kraków Ostrzeżenie: (30%) ![]() ![]() |
Halo? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nikt nie da rady zrobic tego sortowania szybciej niz php?
|
|
|
![]()
Post
#33
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 10.09.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Poza tym jak nie masz zmiennych w tekście używaj pojedynczych cudzysłowów a nie podwójnych! Ten post edytował prgTW 3.12.2007, 22:51:34 |
|
|
![]()
Post
#34
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Cytat mixed microtime ([ bool $get_as_float ] ) - 5.0.0 The get_as_float parameter was added. Co oznacza, że w dzisiejszych czasach wystarczy:
@domis86 Metoda optymalizacji tego problemu jest bardzo prosta - należy kupić szybszy komputer (u mnie wykonuje się ten kod w ok sekundę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ) Jeśli jednak to ci nie odpowiada - możesz skorzystać również z asort () które to wygląda na ok. 30% szybsze. |
|
|
![]()
Post
#35
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 12.04.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Nalezy zwrocic uwage na ograniczona dziedzine wartosci jakie moga znalezc sie w tablicy do posortowania. Mozna wykorzystac count sort i posortowac w czasie liniowym od ilosci elementow. Nie musze wydawac pieniedzy na lepszy komputer. Pozdrawiam |
|
|
![]()
Post
#36
|
|
Grupa: Zarejestrowani Postów: 255 Pomógł: 5 Dołączył: 20.03.2007 Skąd: Kraków Ostrzeżenie: (30%) ![]() ![]() |
<jupi>
W koncu ktos odpowiedzial. Ehh kiepsko cos z waszą optymalizacją (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) buzi dla bartek00 Ten post edytował domis86 4.12.2007, 15:12:40 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 10:53 |