• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Betovsky

40 dicas de optimização

17 mensagens neste tópico

If a method can be static, declare it static. Speed improvement is by a factor of 4.

echo is faster than print.

Use echo's multiple parameters instead of string concatenation.

Set the maxvalue for your for-loops before and not in the loop.

Unset your variables to free memory, especially large arrays.

Avoid magic like __get, __set, __autoload

require_once() is expensive

Use full paths in includes and requires, less time spent on resolving the OS paths.

If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time()

See if you can use strncasecmp, strpbrk and stripos instead of regex

str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4

If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.

It's better to use select statements than multi if, else if, statements.

Error suppression with @ is very slow.

Turn on apache's mod_deflate

Close your database connections when you're done with them

$row[’id’] is 7 times faster than $row[id]

Error messages are expensive

Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.

Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.

Incrementing a global variable is 2 times slow than a local var.

Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable.

Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one.

Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists.

Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance.

Methods in derived classes run faster than ones defined in the base class.

A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations.

Surrounding your string by ' instead of " will make things interpret a little faster since php looks for variables inside "..." but not inside '...'. Of course you can only do this when you don't need to have variables in the string.

When echoing strings it's faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.

A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts.

Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times.

Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request

When working with strings and you need to check that the string is either of a certain length you'd understandably would want to use the strlen() function. This function is pretty quick since it's operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick.

Ex.

if (strlen($foo) < 5) { echo "Foo is too short"; }

vs.

if (!isset($foo{5})) { echo "Foo is too short"; }

Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it's execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string's length.

When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don't go modifying your C or Java code thinking it'll suddenly become faster, it won't. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend's PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.

Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory.

Do not implement every data structure as a class, arrays are useful, too

Don't split methods too much, think, which code you will really re-use

You can always split the code of a method later, when needed

Make use of the countless predefined functions

If you have very time consuming functions in your code, consider writing them as C extensions

Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview

mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%

Fonte : http://reinholdweber.com/?p=3

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Excelente link...

Pelas explicações das dicas faz parecer que o PHP é lento ou que a sua implementação não é tão rápida quanto poderia...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O php na verdade é rápido. Na verdade é de longe mais rápido que as tecnologias concorrentes que aí andam.

Os problemas com o php podem prendem-se com a escalabilidade pois não está muito desenhado para sites com grande porte de tráfego, se bem que se aguente bem... basta olhar para o yahoo que é o site mais visitado de todos e usa php.

O grande problema é que cada visitante acede a um script que é executado individualmente. Se tivermos mil visitantes simultaneos... são mil interpretações de um script. Isto não é grande estratégia para sites de grande trafego.

Pode mitigar-se este problema com o uso de fastcgi mas isso não vai resolver os problemas todos.

Por outras palavras, o php não está concebido para sites de grande trafego mas acaba por se desenrascar. Mas na área para a qual foi desenhado não tenham dúvidas que é incrivelmente rápido.

As dicas são válidas mas algumas são coisas um pouco xonés que lá estão... tipo... um programador com alguma experiencia nunca ia cometer os erros referidos em praí metade delas.

Ainda assim é uma boa leitura, pode iluminar muito boa gente. Muita coisa valida para outras linguagens tambem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para comparação pedrotuga, temos por exemplo o deviantART. Solução deles? PHP (source code em C) alterado à medida, balanceamento de processamento e uso de caching. E só têm 29 servidores a interagir directamente com os clientes (http://admin.deviantart.com/setserver). ;)

PS: Ainda não li o link.

EDIT: Depois de ler o link, fiquei a saber coisas que ainda não sabia, e de facto são pequenas coisas que podem fazer a diferença.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na verdade é de longe mais rápido que as tecnologias concorrentes que aí andam.

Isso não é verdade. Só mesmo Ruby é que consegue ser mais lento que o PHP...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na verdade é de longe mais rápido que as tecnologias concorrentes que aí andam.

Isso não é verdade. Só mesmo Ruby é que consegue ser mais lento que o PHP...

Dá-me um exemplo de uma linguagem mais rápida no domínio web. E só aceito mais rápidas se elas fizerem o mesmo que o PHP, o que inclui controlo/buffering de output, gestão de sessões, etc.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dá-me um exemplo de uma linguagem mais rápida no domínio web. E só aceito mais rápidas se elas fizerem o mesmo que o PHP, o que inclui controlo/buffering de output, gestão de sessões, etc.

Eu não tenho de fazer o teu trabalho de casa... vai tu procurar porque elas existem.

Não comecem mais uma guerrinha de linguagens...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dá-me um exemplo de uma linguagem mais rápida no domínio web. E só aceito mais rápidas se elas fizerem o mesmo que o PHP, o que inclui controlo/buffering de output, gestão de sessões, etc.

Eu não tenho de fazer o teu trabalho de casa... vai tu procurar porque elas existem.

Não comecem mais uma guerrinha de linguagens...

Tu é que começaste a dizer que havia mais rápidas, eu estou-te a perguntar se estás a ter em conta os factores que eu enumerei.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podem perguntar ao vosso amigo google e vão chegar à mesma conclusão que eu.

http://www.google.com/search?q=php%20vs%20pytohn%20speed

http://www.google.com/search?q=php%20vs%20ruby%20speed

http://www.google.com/search?q=php%20vs%20perl%20speed

http://www.google.com/search?q=php%20vs%20java%20speed

http://www.google.com/search?q=php%20vs%20asp%20speed

Sempre que os problemas de velocidade do php aparecem estão ligados a grandes volumes de tráfego. Mas como eu já disse isso é por causa da forma como o PHP funciona. Não está feito para essas andanças, ainda que se safe mais ou menos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só mais uma para a lista: Se usarem recorrentemente uma ligação à base de dados, mais vale usar uma conecção persistente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem que poderiam traduzir isto xD

Dúvida

# Use echo's multiple parameters instead of string concatenation

Nao entendi xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem que poderiam traduzir isto xD

Dúvida

# Use echo's multiple parameters instead of string concatenation

Nao entendi xD

Em vez de fazeres echo "ois".$oi."oix";, fazes echo "ois",$oi,"oix";
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha outra:

Set the maxvalue for your for-loops before and not in the loop.

Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.

40 dicas de optimização... lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por ser uma linguagem interpretada, não existe esse problema de estar sempre a aceder à função count() nos ciclos? Sempre pensei que assim fosse.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este tópico tinha-me passado completamente ao lado e achei-o interessante...

Só acho que perde bastante "credibilidade" (não é bem esta a palavra ideal mas está escapar-me uma melhor) porque apesar de em alguns pontos até diz que "forma X é mais rápido que Y por um factor Z" em outros diz "evitem isto" sem qualquer razão a explicar porquê.

Como tal, foi à procura de algo melhor e apesar de não ler tudo (nem este tópico li) penso que deve incluir todos os pontos que estão neste tópico (e mais alguns) com explicações para cada um deles:

http://www.hm2k.com/posts/50-php-optimisation-tips-revisited

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por ser uma linguagem interpretada, não existe esse problema de estar sempre a aceder à função count() nos ciclos? Sempre pensei que assim fosse.

O problema de chamar uma função num ciclo é igual para linguagens interpretadas ou compiladas (claro que no caso de uma linguagem compilada em que count() fosse uma macro e o array tivesse tamanho definido em compile-time esse problema não existiria).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora