Raised This Month: $51 Target: $400
 12% 

Diferencia de Métodos


  
 
 
Thread Tools Display Modes
Author Message
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 03-13-2012 , 23:13   Diferencia de Métodos
#1

Bueno vengo con una pregunta que me gustaría que respondieran para ver cuánto saben, es algo simple. Me encantaría que probaran esto con profile y me dijeran si hay alguna diferencia de tiempo en completar la llamada a la función.

Usando esta cadena
PHP Code:
new g_String[10][] =
{
    
"hola",
    
"adios",
    
"oso",
    
"pato",
    
"tigre",
    
"comer",
    
"dormir",
    
"saltar",
    
"jugar",
    
"goma"

Método 1:
PHP Code:
bool:YourFunction(const string[])
{    
    new 
bool:found false
    
for(new isizeof g_Stringi++)
    {    
        if(
equal(stringg_String[i]))
        {
            
found true
            
break
        }
    }
    return 
found    

Método 2:
PHP Code:
YourFunction(const string[])
{    
    for(new 
isizeof g_Stringi++)
    {    
        if(
equal(stringg_String[i]))
        {
            return 
1
        
}
    }
    return 
0    

Usando estos 2 ejemplos, como es más eficiente?


PS: La idea es que escriban ustedes un string y verificar si existe en la cadena ya mencionada y fijarse cual se llama más rápido.

Respuesta: http://forums.alliedmods.net/showpos...1&postcount=10
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 03-14-2012 at 14:52.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
Neeeeeeeeeel.-
Some Guy Yellin'
Join Date: Jul 2010
Location: Argentina
Old 03-13-2012 , 23:55   Re: Diferencia de Métodos
#2

Según mi lógica el método más eficiente dos. Porque retorna el valor directamente, no pierde tiempo creando una variable. Pero no se me suena raro.
__________________
Neeeeeeeeeel.- is offline
Send a message via Skype™ to Neeeeeeeeeel.-
Old 03-14-2012, 00:04
XINLEI
This message has been deleted by XINLEI. Reason: Wrong.
shinoda
Spanish Moderator
Join Date: Nov 2009
Location: ag_crossfire
Old 03-14-2012 , 00:08   Re: Diferencia de Métodos
#3

Con el 2do método evitas la creación de una variable y deberías usar Tries, no bucles.
shinoda is offline
Send a message via MSN to shinoda Send a message via Skype™ to shinoda
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 03-14-2012 , 00:15   Re: Diferencia de Métodos
#4

Quote:
Originally Posted by shinoda View Post
Con el 2do método evitas la creación de una variable y deberías usar Tries, no bucles.
No va al tema lo segundo que dijiste. La pregunta es con respecto al consumo entre estos 2 métodos. Además hice una cadena de string, pero pudo haber sido de números también. Era solo un ejemplo.
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 03-14-2012 at 00:16.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
shinoda
Spanish Moderator
Join Date: Nov 2009
Location: ag_crossfire
Old 03-14-2012 , 00:51   Re: Diferencia de Métodos
#5

Quote:
Originally Posted by gladius View Post
No va al tema lo segundo que dijiste. La pregunta es con respecto al consumo entre estos 2 métodos. Además hice una cadena de string, pero pudo haber sido de números también. Era solo un ejemplo.
Entonces serviría como ayuda para otros lol.

Oke, si aún lo quieres aquí te dejo las dos pruebas que hice con este plugin usando AmxModX v1.8.2-dev.

PHP Code:
#include <amxmodx>

new g_String[10][] =
{
    
"hola",
    
"adios",
    
"oso",
    
"pato",
    
"tigre",
    
"comer",
    
"dormir",
    
"saltar",
    
"jugar",
    
"goma"
}

public 
plugin_init()
{
    
register_srvcmd"test""srvcmd_test" )
}

public 
srvcmd_test()
{
    static const 
szString[] = "dormir"
    
    
Function1szString )
    
Function2szString )
}

Function1( const string[] )
{
    new 
bool:found false
    
    
for(new isizeof g_Stringi++)
    {    
        if(
equal(stringg_String[i]))
        {
            
found true
            
break
        }
    }
    return 
found    
}

Function2( const string[] )
{
    for(new 
isizeof g_Stringi++)
    {
        if(
equal(stringg_String[i]))
            return 
1
    
}
    
    return 
0    

Code:
date: Tue Mar 13 23:49:02 2012 map: crossfire3
type |                             name |      calls | time / min / max
-------------------------------------------------------------------
   n |                  register_srvcmd |          1 | 0.000071 / 0.000071 / 0.000071
   n |                            equal |         14 | 0.000023 / 0.000001 / 0.000003
   p |                      plugin_init |          1 | 0.000004 / 0.000004 / 0.000004
   p |                      srvcmd_test |          1 | 0.000006 / 0.000006 / 0.000006
   f |                        Function1 |          1 | 0.000014 / 0.000014 / 0.000014
   f |                        Function2 |          1 | 0.000013 / 0.000013 / 0.000013
0 natives, 0 public callbacks, 2 function calls were not executed.

date: Tue Mar 13 23:49:20 2012 map: crossfire3
type |                             name |      calls | time / min / max
-------------------------------------------------------------------
   n |                  register_srvcmd |          1 | 0.000061 / 0.000061 / 0.000061
   n |                            equal |         14 | 0.000023 / 0.000001 / 0.000003
   p |                      plugin_init |          1 | 0.000004 / 0.000004 / 0.000004
   p |                      srvcmd_test |          1 | 0.000006 / 0.000006 / 0.000006
   f |                        Function1 |          1 | 0.000014 / 0.000014 / 0.000014
   f |                        Function2 |          1 | 0.000013 / 0.000013 / 0.000013
0 natives, 0 public callbacks, 2 function calls were not executed.
shinoda is offline
Send a message via MSN to shinoda Send a message via Skype™ to shinoda
Stereo
Veteran Member
Join Date: Dec 2010
Old 03-14-2012 , 09:38   Re: Diferencia de Métodos
#6

donde puedo encontrar eso shinoda ¿?
Stereo is offline
lucas_7_94
Leche Loco
Join Date: Mar 2009
Location: Argentina
Old 03-14-2012 , 09:40   Re: Diferencia de Métodos
#7

http://forums.alliedmods.net/showthread.php?t=67752
__________________
ATWWMH - MiniDuels
Madness is like gravity, just need a little push.
lucas_7_94 is offline
Send a message via Skype™ to lucas_7_94
Neeeeeeeeeel.-
Some Guy Yellin'
Join Date: Jul 2010
Location: Argentina
Old 03-14-2012 , 12:36   Re: Diferencia de Métodos
#8

Eaa respondí bien (? hace rato había visto eso que puso shinoda y no sabía de donde había salido, gracias lucas.

Edit: En la versión de Arkshine vienen 2 includes, amxmodx y profiler. Que tiene de diferente el amxmodx? Para que se usa o.o
__________________

Last edited by Neeeeeeeeeel.-; 03-14-2012 at 12:40.
Neeeeeeeeeel.- is offline
Send a message via Skype™ to Neeeeeeeeeel.-
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 03-14-2012 , 14:51   Re: Diferencia de Métodos
#9

Pensé que el profiler iba a dar una pista de lo que quería decirles.

Bueno les cuento trabajando en C/C++ hay ciertas cosas que deberían saber quiero empezar por explicarles por qué coloqué esos 2 métodos.

Como estamos comparando 2 formas diferentes y casi no se note la diferencia, estamos buscando la mejor manera de hacerlo.

Método 1:
PHP Code:
bool:YourFunction(const string[])
{    
    new 
bool:found false
    
for(new isizeof g_Stringi++)
    {    
        if(
equal(stringg_String[i]))
        {
            
found true
            
break
        }
    }
    return 
found    

Si bien pueden ver que hay una variable boolean (4 bytes más al programa) para verificar que el string fue encontrado y luego usamos un break para terminar el bucle. Por último retornamos el valor del bool.

Si el ciclo lo repetimos 10 veces

Con el break estaríamos haciendo 1 instrucción, lo cual si trabajamos con grandes bucles no cambia en nada, y el consumo del boolean ni se notaría. Luego hacemos solo 1 instrucción con el return al final de la función.

Método 2:
PHP Code:
YourFunction(const string[])
{    
    for(new 
isizeof g_Stringi++)
    {    
        if(
equal(stringg_String[i]))
        {
            return 
1
        
}
    }
    return 
0    

Si bien podemos decir que en comparación al método 1, ahorramos la llamada de una variable y usamos los valores directamente, pero les informo que con este el programa sería unas milésimas más lento. Ya que el return lo que hace es almacenar el valor en la memoria, por ende cada vez que se lee el ciclo, estaríamos almacenando el valor.

Si el ciclo lo repetimos 10 veces

Con el return estaríamos haciendo "x" instrucciones (x = Hablo de las veces que se recorre el ciclo hasta encontrar el valor que convalide con la condición que está dentro del bucle y finalmente se aplique el return), lo cual si trabajamos con grandes bucles, podría llegar a consumir más de los 4 bytes que consume el boolean.


Por ende, la mejor opción sería usar el Metodo 1.


PS: Tengo otros tips que de a poco iré dejando aquí en AM
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 03-14-2012 at 14:51.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
shinoda
Spanish Moderator
Join Date: Nov 2009
Location: ag_crossfire
Old 03-14-2012 , 19:09   Re: Diferencia de Métodos
#10

Yo aún no entiendo lo que quieres decir.
Si estás seguro estaría bien que nos muestres un enlace o pruebas para entenderlo mejor.

Ya que el return lo que hace es almacenar el valor en la memoria, por ende cada vez que se lee el ciclo, estaríamos almacenando el valor.

El return sólo se va a ejecutar una vez al igual que el break.
Lo que logro entender de lo que quieres decir es "que la condición siempre va a ser verdadera".
Otra cosa, yo personalmente jamás escuché o leí algo relacionado a estos dos métodos, pero el objetivo de usar variables es para poder usarlo más adelante, por eso prefiero el 2do método.

Break: Sale del bucle.
Return: Sale de la función.

EDIT: Postéalo en Scripting help, seguramente ahi te darán una respuesta más clara ya que hay gente que realmente sabe .

Last edited by shinoda; 03-14-2012 at 19:16.
shinoda is offline
Send a message via MSN to shinoda Send a message via Skype™ to shinoda
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 10:02.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode