Delphi – C # – D
Delphi – Eiffel – Groovy
Java – Lisaac – Python – Ruby
Simula – Smalltalk
visual básico – wlenguage

Idiomas imperativos

APL – ASP – Assembler (unha montaxe de montaxe ou linguaxe de ensamblador ou simplemente ensamblador por abuso de linguaxe, . ..)
BASIC (na programación, BASIC é un acrónimo para o código de instrución simbólica de inicio do inicio. Quen …) – C (C ++ é unha linguaxe de programación que permite a programación en varios paradigmas …) – COBOL (COBOL é unha linguaxe de programación de terceira xeración creado en 1959 …) – Natural (natural é un linguaxe de programación semi-compilado, editado pola empresa …)
FORTH – FORTRAN – LIMBO
Logotipo – Pascal – Perl – PHP (PHP (Acrónimo PHP: o preprocesador de hipertexto), é unha linguaxe de SCR Ipts gratuitos principalmente …)

Idiomas funcionais

Haskell – ml / ocaml
Lisp / Common Lisp (Lisp é a familia máis antiga de Idiomas imperativos e funcionais. Desenvolvido …)
Esquema – XSLT

Idiomas declarativos

Clips – Prolog (Prolog é un dos principais idiomas de programación lóxica inventado en …)

Linguas de competidores

Ada 95 – Erlang

Ver tamén

Design – Codificación (xeralmente unha codificación permítelle cambiar dunha representación de …)
Probas – Optimizacións

En programación informática (programación no dominio da computadora é todas as actividades que permiten …), a optimización é a práctica de reducir o tempo (o tempo é un concepto desenvolvido polo ser humano para aprehender a …) Execución dunha función, o espazo ocupado polos datos e do programa ou O consumo de enerxía (en sentido común a enerxía significa todo o que permite realizar un emprego, facer …).

A regra número un (número uno é unha referencia a un modelo de caracteres ficticios do …) de optimización Só debe intervir unha vez que o programa funcione e responde ás especificacións funcionais. A experiencia mostra que a aplicación de optimizacións de baixo código antes destas dúas condicións faise máis a miúdo volveuse a unha perda de tempo e é prexudicial para a claridade do código e do bo funcionamento do programa:

“A optimización prematura é a fonte de todos Ills. “, Donald Knuth (Donald Ervin Knuth () (10 de xaneiro de 1938 en Milwaukee, …) Citting Dijkstra

Con todo esta cita, truncada, é moi mal interpretada. A versión completa é:

” Deberiamos esquecer pequenas optimizacións locais, por exemplo, o 97% da época: a optimización prematura é a fonte de todos os males. (Deberiamos esquecer (Sobre é un termo de carpintería que designa o final de formación …) pequena eficiencia, por exemplo 97% do tempo: a optimización prematura é a raíz de todo o mal.) “, Donald Knuth

A cita orixinal indica moi claramente que esta regra só debería aplicarse a optimizacións locais, baixo nivel (reescritura en Ensamblador, bucle desenrolado, etc.) e non a optimizacións de alto nivel sobre a elección de algoritmos ou arquitectura (a arquitectura pode definirse como a arte dos edificios de construción.) Un proxecto (un proxecto é un proxecto compromiso irreversible de resultado incerto, non reproducible a …). Pola contra, canto máis crece o proxecto e máis estas optimizacións de alto nivel serán difíciles e caras (en termos de tempo, dificultade e orzamento), se non imposible, para realizar.

Prácticas de compiladores máis recentes automaticamente. (O automático forma parte das ciencias de enxeñaría. Esta disciplina trata sobre o …) un número (a noción de número lingüístico é tratada no artigo “Número …) das optimizacións sería tedioso de realizar manualmente e que faría que o código fonte (o código fonte (ou fontes ou fontes) sexa un conxunto de instrucións escritas en …) menos lexible.

O manual local de optimización pode ser necesario en casos moi específicos, pero o As medidas mostran que nas máquinas RISC que teñen un alto número de rexistros e onde a eficacia require a agrupación das instrucións idénticas para beneficiarse do efecto de gasoduto, o optimizador dun compilador (un compilador é Un programa informático que traduce un idioma, o idioma de orixe, nun …) C moitas veces proporciona un código máis efectivo que o que escribiu en Assembler por un programador (en informática, desenvolvedor (ou programador) é un científico informático que realiza software En …) experimentado (que nunca foi o caso das máquinas CISC).E a partir deste código é moito máis fácil de manter, porque as instrucións C permanecen nunha orde relacionada coa única intelixibilidade do código e non ás especificidades da máquina: nos actualizadores actuais, de feito, as ordes asociadas a unha instrución ( Unha instrución é unha forma de información comunicada que tanto un comando como a …) xa non son necesariamente na posición contigua, por razóns de eficiencia de execución. Isto fai que o código de ensamblador xerado particularmente indecible.

Práctica de optimización

Primeiro achegamento

Antes de iniciar a optimización, debes saber como medir a velocidade (distinguimos 🙂 Código. Para iso tes que escoller un parámetro (un parámetro está en sentido amplo, un elemento de información a ter en conta …), preferentemente sinxelo, medible. Isto pode, por exemplo, o tempo de procesamento nun xogo de datos (en tecnoloxía da información (TI), un dato é unha descrición básica, moitas veces …) precisa ou o número de imaxes que se amosan por segundo (segundo é o feminino do Segundo adxectivo, que vén inmediatamente despois do primeiro ou que …), ou o número de solicitudes procesadas por minuto (primeira forma dun documento: dereito: un minuto é o orixinal de ‘a …).

Unha vez que o parámetro de medida medido, ten que medir o tempo dedicado (o pasado é o primeiro de todo un concepto relacionado co tempo: consta de todo.) En cada parte do programa. Non é raro que o 80% ata o 90% do tempo dedique a execución do 10% do código (bucles críticos). Os números varían segundo o tamaño e complexidade (a complexidade é unha noción usada na filosofía, a epistemoloxía (por …) de proxectos. Debemos localizar estes 10% de código para ser o máis rendible nas súas optimizacións. Este paso de localización pode realizar ferramentas de instrumentación especializada (a instrumentación da palabra úsase en varios dominios 🙂 dos perfís de código nomeados. Son responsables de contar o número de execucións de cada función e ciclos do microprocesador (un microprocesador é un procesador cuxos compoñentes foron suficientemente …) correspondente durante a execución.

Entón forma parte da sección de maior consumo de recursos tantas veces como sexa necesario este ciclo:

  • optimización dunha parte do Código
  • Medición de ganancia de rendemento

segundo enfoque

Un programa:

  • a nivel algorítmico ( O algoritmo) pódese optimizar Ique é todas as regras e técnicas que están implicadas …), ao elixir un algoritmo de menor complexidade (no sentido (significado (estratexias para a enxeñaría senescencia negativa) é un proxecto científico que ten como obxectivo …) Matemáticas) e adaptado estruturas de datos,
  • a nivel de linguaxe de desenvolvemento, ordenando as instrucións e utilizando bibliotecas dispoñibles,
  • usando localmente un idioma de baixo nivel (un idioma de baixo nivel é un idioma que require que o programador se preocupe cos conceptos próximos …), que pode ser a linguaxe C ou, para as necesidades máis críticas, a linguaxe de ensamblador.

Só imos a nivel superior de optimización unha vez As posibilidades dun nivel foron esgotadas. O uso dunha linguaxe de baixo nivel en xeral (en teoría de conxuntos, un conxunto de forma intuitiva denota unha colección …) dun proxecto por razóns de velocidade é un dos erros máis comúns e máis caro que facer un proxecto industrial .

Optimización de código (en programación informática, a optimización é a práctica que xeralmente consiste …) é considerada por moitos desenvolvedores afeccionados como unha arte non máxica e, por este motivo, como un dos máis emocionantes As partes da programación (a programación no campo da computación son todas as actividades que permiten …). Isto lévaos a crer que un bo programador é unha persoa que optimiza o programa inmediatamente. Non obstante, a experiencia demostra que non pode dobrar un mal deseño inicial. Está no deseño que xoga a experiencia do desarrollador (a meixela é a parte da cara que cobre a cavidade oral, pechada polo …) máis. Ademais, nunha maioría e crecente número de casos, o “bo programador” é menos o que escribe o código intelixente (o optimizador fará máis a miúdo mellor que el) que o código escrito escrito e fácil de manter.

Un bo coñecemento das técnicas estruturais de datos, así como algoritmos (mesmo sen ir ás consideracións teóricas da complexidade algorítmica) é moito máis fértil que a dunha linguaxe de montaxe.Cando se determinou o algoritmo máis adecuado, pódense obter as optimizacións máis eficaces mediante a seguinte ruta:

  • Escritura de código crítico en linguaxe de alto nivel (un idioma de alto nivel en informática é Unha linguaxe de programación que permite ao programador …) (como o esquema ou o LISP común),
  • aplicación de transformacións matemáticas (a matemática é unha área de coñecemento abstracta construída usando o uso …) sucesivo que preserve a especificación do programa Todos (todos incluídos como un conxunto do que existe a miúdo é interpretado como o mundo ou …), reducindo o consumo de recursos,
  • Tradución de código transformada nun idioma de baixo nivel (linguaxe C).

Na práctica, o rendemento das máquinas actuais fai que as aplicacións con moitas saídas de saída lentas poidan gardar estes tres pasos e escribir directamente Unha lingua como Haskell. A aplicación de nget coñecida, que recolleu sistematicamente as imaxes publicadas nos foros de Usenet, tiña na súa primeira implementación (a palabra implantación pode ter varios significados 🙂 Verán escrito en Haskell. A versión C foi só unha tradución que non se revela máis eficiente para este tipo de aplicación. Unha aplicación limitada principalmente pola CPU ea velocidade da memoria (en xeral, a memoria é o almacenamento da información. Tamén é a memoria …) por contra pode gañar moito que escribir nunha lingua como C ou C ++.

Optimización automática

Os compiladores son a miúdo capaces de facer optimizacións locais, ás que ningún desarrollador pensaría no primeiro enfoque.

para a linguaxe C, Isto pode considerar:

  • variables locais e rexistros
  • As funcións que non están implementadas en ensamblador como función
  • o interruptor, que son óptimas.

Con todo, o compilador pode axudar moito ao declarar as variables coas palabras clave const e / ou restrinxir cando é posible. En caso contrario, o compilador non pode saber se unha área de memoria é accesible por outras referencias e desactivar as optimizacións (fenómeno chamado aliasing de memoria).

Exemplos

Uso de variables locais para evitar o alias de memoria

/ H4>

O seguinte código C ++ xeralmente será pouco optimizado polo compilador porque moitas veces non pode saber se o código do ciclo modifica ou non o contador de iteración: un punteiro ou unha referencia pode modificalo.

 void MyClass::DoSomething() const { for( int i=0; im_nbrElements; ++i ) { void *ptr = GetSomePtr(); .... } } 

Nesta versión, está claro que hai unha serie de iteracións fixadas con antelación e que nunca cambiará, permitindo que o compilador sexa máis agresivo optimizacións:

 void MyClass::DoSomething() { const int nbrElements = m_nbrElements; for( int i=0; inbrElements; ++i ) { .... } } 

unha especificidade do binario: a offset

Unha das primeiras optimizacións foi a da división (a división é unha lei de composición que a dous números asocia o produto do primeiro por …) e multiplicas (A multiplicación é unha das catro operacións da aritmética elemental …) por unha potencia (a palabra de potencia úsase en varios dominios cun significado particular 🙂 de 2.

De feito, ordenador (informática – Contracción de información e automática – é a extensión de …) está baseada no binario, xa que usa como elemento básico o transistor (e históricamente, antes do relé) que n. autoriza que dous valores diferentes.

Así que teñamos lóxicamente implementado en linguaxe de máquina (a linguaxe da máquina é a secuencia de bits que interpretan o procesador da computadora …) as operacións offset á esquerda e o cambio á dereita.

De feito, en binario, o desprazamento dunha cantidade de muesca á esquerda multiplícala por 2.

polo que, 2 (102) compensación de 1 bit dar 4 (1002). (1012) O cambio de 2 bits dá 20 (101002): 5 * 22 = 20.

Este traballo (camiñar (o pleonasmo de pé tamén se usa a miúdo) é un …) tamén para a división, cambiando Os bits á dereita.

100 (11001002) cambiou de 3 bits á dereita dá 100/23 = 12,5 polo que 12 (11002) porque traballamos en enteiros.

A división (fóra deste caso e casos patolóxicos) é unha instrución cara na máquina de tempo e aínda non está dispoñible na gran maioría dos procesadores RISC.

a palabra clave (no sentido limpo, A clave ou a tecla (as dúas grafías son correctas) é un dispositivo extraíble …) En liña C

Código C seguinte:

 inline int f(int a, int b) { return a * b; } int g (int a) { switch (a) { case 10: return f(a, a); case 11: case 12: return f(a - 2, a); case 1200: return f(a - 2, a); default: return f(a, a); } } 

Unha compilación con GCC -O4 -S dá:

 .file "opt.c" .text .p2align 4,,15 .globl g .type g, @function g: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx cmpl $12, %edx jg .L14 leal -2(%edx), %eax cmpl $11, %edx jge .L15 movl $100, %eax cmpl $10, %edx .L17: je .L2 movl %edx, %eax .L15: imull %edx, %eax .L2: popl %ebp ret .p2align 4,,7 .L14: movl $1437600, %eax cmpl $1200, %edx jmp .L17 .size g, .-g .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.2 (Mandrake Linux (Au sens strict, Linux est le nom du noyau de système d'exploitation libre, multitâche,...) 10.0 3.3.2-6mdk)" 

Que podería traducir, para unha mellor comprensión, polo seguinte código C:

 int g(int a) { int eax, b; if (a > 12) /* cas a == 1200 */ goto (L’instruction goto (de l’anglais go to, en français aller à) est une...) L14; eax = a - 2; if (a >= 11) /* cas a == 11 ou a == 12 */ goto L15; eax=100; /* = 10 * 10 */ b=10; L17: if (a == b) /* cas a == 10 */ goto L2; /* cas "default" */ eax=a; L15: eax=eax*a; L2: return eax; L14: eax = 1437600; /* = 1200*(1200-2) */ b = 1200; goto L17; } 

pódese notar Por exemplo, non se xerou a función ‘F’, senón que o seu código foi directamente incorporado ao ‘g’ (a palabra clave “en liña” fai posible forzar este tipo de optimización C)

Este artigo agradeceu vostede? Compárteo en redes sociais cos teus amigos!

Leave a comment

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *