Ver Mensaje Individual
  #7 (permalink)  
Antiguo 27/03/2013, 20:15
Avatar de dontexplain
dontexplain
 
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: ¿Alguna idea para optimizar el código?

Cita:
Iniciado por amchacon Ver Mensaje
En resumen, el uso de la CPU depende de:

- Los descansos que tenga el procesador en el programa.
- Los núcleos que tenga el procesador (cada núcleo puede lanzar un hilo de ejecución, por tanto si saturas un núcleo te quedan los demás). Como tienes un procesador mononúcleo el porcentaje se dispara.
Toda la razón. Hace no mucho tiempo estuve haciendo straces a algunos procesos y hace muchos descansos. Las llamadas al sistema revelan que hace o bien con sleep descansos de segundos o con microsleep (usleep), incluso con nanosleep que admite estructuras de {seconds, nanoseconds} para la resolución del descanso (sobre todo). Desconozco el impacto que pueden tener en el rendimiento, porque no lo he analizado más que nada, pero también se usa while, y su impacto es relativamente bajo (creo que menor que sleep porque hace interrupciones para calcular la diferencia de tiempo además de que hace llamadas a estas funciones de la librería)

(asumiendo que val es un bool)

while(val)

Código Ensamblador:
Ver original
  1. mov eax, 00000001h (00000032h)
  2. // entre medias las operaciones que sean
  3. cmp eax,dword ptr [val] // asumiendo 4 bytes y que val podría haber cambiado
  4. je main+xxh (u otra, pero la cuestión es que salte a 00000032h)

Asumo que true es 1 (lo es), y que cmp compara el valor de eax donde se almacena true invariablemente con el valor del puntero [val] que almacena el boleano variable. En la línea 4 hay un salto corto, revisar EB. (1)

Si consigo que mi PC deje de dar pantallazos azules cuando le de la gana, reviso el código resultante de usleep y microsleep y posteo la comparación aquí.

(1) El salto corto hace un salto relativo corto a la posición indicada como suma. La mayoría de los desensambladores suelen sumar a ese valor +2 posiciones de memoria porque las instrucciones son 2 bytes y hace el cálculo teniendo en cuenta el tamaño. En cualquier caso siempre será el valor de main+((xxh)+2) ya que será referente a EIP que almacena siempre la siguiente dirección de la memoria mientras ejecuta. O sea, si está ejecutando 0x0000000d almacenará 0x0000000f y el salto será referente a la segunda dirección, ergo habrá que sumar el offset corto a esa última dirección.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 27/03/2013 a las 20:51