![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Pero tienes el rando de busqueda acotado, asi que no debe ser tan grande. Ademas con fuerza bruta tienes un algoritmo sequencial donde pagas lo mismo por cada vez que lo ejecutes. Solo es rapido si apuestas a que la respuesta esta al inicio del rango de busqueda. Ademas estas buscando integers. Eso se puede almacenar super-eficiente.
__________________
El malabarista. |
|
#2
|
||||
|
||||
|
Entiendo que aguml solo ha pretendido experimentar. Al principio no entendí bien lo que pretendía y escribí un código muy simple que evidentemente no era lo que él buscaba. Siguiendo con la causa original del hilo me permito aportar un código usando C, sin ayuda de cadenas estilo delphi, como él usa, mucho más eficiente.
He usado un serial como éste: FAB1AF04. La función de aguml ha dado con el resultado en 262,875 segundos, mientras que la función que propongo ha tardado 8,656 segundos en un i7. La diferencia es más que notable: 30 veces más rápido, y dedicándole un poco más de tiempo, seguro que se le puede hacer rendir algo más: Código PHP:
|
|
#3
|
||||
|
||||
|
tengo que probarlo, se ve mas corto y con muy buena pinta.
|
|
#4
|
||||
|
||||
|
Bueno, tuve que mirarlo y tracear porque a simple vista habia cosas que no tenia claras y luego de tracear me sorprendio los tiempos que obtenia y entonces pensé "claro, el empieza de izquierda a derecha el incremento y yo al contrario y como la palabra buscada era F1ACA pues el llegaba antes a la A que yo a la F" entonces decidí dar la vuelta a la cadena tal como ACA1F y mi sorpresa incrementa al ver que casi no cambió el tiempo ya que subió unos 100 milisegundos
.Con esto solo puedo felicitar al maestro Escafandra por un codigo tan bueno como este. Una cosa mas, le vi un fallo y es que no tiene control de fin de busqueda y si no encuentra la cadena sigue incrementando hasta llegar a desbordar el array por lo que le hice algunos pequeños cambios, el principal para subsanar ese problema y otros para hacerlo mas entendible para mi. Otra cosa, me dio por probar cambiar los for que inicializan la cadena de tope y la cadena inicial por dos memset y vi que los tiempos se incrementaban solo con eso asi que lo dejé con los for. Supongo que memset hace algo mas internamente que ralentiza un poco el proceso. Aquí el código final: Código PHP:
Clic aqui para ver imagen Alucinante la mejora. Mil gracias amigos. Última edición por aguml fecha: 23-10-2014 a las 18:17:30. |
|
#5
|
||||
|
||||
|
Otro posible (aunque no se hasta que punto probable) fallo. El contador que se usa en el for principal puede llegar a desbordarse (en mi maquina quizas en un par de eones jejeje) ya que incrementa continuamente y dependiendo de lo grande del serial a buscar podria ocurrir.
Lo he solucionado poniendo la siguiente linea al final del for que se encarga del acarreo: Código PHP:
|
|
#6
|
||||
|
||||
|
Cita:
Saludos. Última edición por escafandra fecha: 23-10-2014 a las 19:23:56. |
|
#7
|
||||
|
||||
|
Pues si, yo la comprobacion de tope la dejaré por si alguna vez se mete un serial incorrecto pero con lo que me indicas te digo que ha pasado de 188 milisegundos a 156 en el mismo ejemplo que estaba viendo. O sea que en un serial mayor se notaria aun mas.
|
|
#8
|
||||
|
||||
|
La velocidad se consigue por el hecho de trabajar con cadenas estilo C y es independiente de si vas de izquierda a derecha o al revés. Si eliminas comprobaciones y condicionales superfluos también aceleras el proceso. El hecho de no comprobar que se terminaron las combinaciones de caracteres no es casual, ya que si la cadena cumple la condición de contener solo los caracteres existentes en Rango, el resultado lo encuentra sí o sí, por lo tanto no puene entrar en un bucle infinito y ganamos rendimiento.
Una cosa que hace perder rendimiento es usar el resto de la división en el bucle principal, que es el más largo. Si lo eliminamos, le procesador hará menos cálculos, perdemos un poco de elegancia en el código pero ganamos algo de tiempo. Como ejemplo pongo lo siguiente: Código PHP:
Un paso más puede ser escribirlo en asm, no lo he hecho pero es muy probable que incremente algo la velocidad |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Seleccionar un determinado rango de caracteres en un memo | ErikMdqqq | C++ Builder | 7 | 02-08-2013 03:51:49 |
| Es posible crear bucle controlado | José Luis Garcí | Varios | 5 | 05-07-2011 10:04:54 |
| Crear codigo de Fuerza Bruta | kurono | Varios | 12 | 31-01-2011 16:46:26 |
| Como crear un bucle con TEdit's | axlrafael | OOP | 12 | 08-05-2008 19:22:48 |
| Cerrar Form "fuerza bruta" | MaMu | Varios | 3 | 22-05-2007 19:59:50 |
|