Szerző Téma: findindex  (Megtekintve 2145 alkalommal)

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
findindex
« Válasz #15 Dátum: 2012. július 25. - 09:39:37 »
0 Show voters
Idézetet írta: Anthony date=1343161164\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"24866\" data-ipsquote-contentclass=\"forums_Topic


A kód neve lehetne findcharacter is talán.
Na mindegy írtam egy változatot én is:
 
stock
findcharacter(const string[], const sub[])
{
new
ch;
while(string[++ch] && string[ch] != sub[0]) {}
return (string[ch])?(ch):(-1);
}

 

   printf(\"%d\", findcharacter(\"asd\", \"s\"));
printf(\"%d\", findcharacter(\"vakáció\", \"s\"));
printf(\"%d\", findcharacter(\"kecske\", \"e\"));
printf(\"%d\", findcharacter(\"kettõ kecske\", \"e\"));
printf(\"%d\", findcharacter(\"magas\", \"s\"));

[/quote]
Hármas operátornál gyorsabb az if-else, bár akkor már 1 sorral hosszabb a kód :D
 
[/quote]
Javítanék rajta, ha nem gond:
 

stock
        findcharacter(const string[], const sub[])
{
        new
                ch = -1;
        while(string[++ch] && string[ch] != sub[0]) {}
        return (string[ch])?(ch):(-1);
}

 
Ugyanis, ha az adott karakter amit találni akarunk a nulladik karakter, akkor -1el térne vissza.
« Utoljára szerkesztve: 2012. július 25. - 12:00:52 írta DrAkE »

findindex
« Válasz #16 Dátum: 2012. július 25. - 11:25:31 »
0 Show voters
@Anthony
  Mi a harmadik operátor ebben?
  Ha ez \":\"
  Akkor az \"if else\" alkalmazásánál is a \"harmadik operator\" (<- ki indulva a megnevezésbõl)  az \"else\".
 
  Szerintem ez a felállás
 
 (feltétel)?(true):(false)  // nem olyan feltét mint a pizzákra :d 

 
ugyanaz mint egy if else
 
if(feltétel) // ?
{
  //true
} else { // :
  //false
)

 
Teljesítményt nem mértem melyik gyorsabb de return után egy if-et lehet nem is fogad el a fordító. pl.: return if(bla)
@DrAkE
 Kösz, javítva. Sok tesztet nem végeztem el csak összedobtam, az utolsó karakterre se teszteltem le lehet ott is rossz.  ;)

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
findindex
« Válasz #17 Dátum: 2012. július 25. - 12:02:57 »
0 Show voters
Utolsó karakterre is tökéletes.

Nem elérhető tonyo

  • 1335
  • Moderális Generátor
    • Profil megtekintése
findindex
« Válasz #18 Dátum: 2012. július 25. - 12:05:11 »
0 Show voters
Idézetet írta: ɐʞzssǝlosz date=1343208331\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"24866\" data-ipsquote-contentclass=\"forums_Topic
@Anthony
  Mi a harmadik operátor ebben?
  Ha ez \":\"
  Akkor az \"if else\" alkalmazásánál is a \"harmadik operator\" (<- ki indulva a megnevezésbõl)  az \"else\".
 
  Szerintem ez a felállás
 
 (feltétel)?(true):(false)  // nem olyan feltét mint a pizzákra :d 

 
ugyanaz mint egy if else
 
if(feltétel) // ?
{
  //true
} else { // :
  //false
)

 
Teljesítményt nem mértem melyik gyorsabb de return után egy if-et lehet nem is fogad el a fordító. pl.: return if(bla)
 
Az a \"?:\" operátor neve, hogy hármas operátor :) [eredeti nevén triadic operator]
 
if(akármi)
{
    return...;
}
else
{
    return...;
}

 
Biztos hogy gyorsabb, mert a WRP-be írtam egy-két függvényt régen if-else \"elágazásokkal\", majd most átírtam \"?:\"-ra, és sokkal lassabb :( [bár így 1 sorba belefér az egész, és nem kell 8 formatot használni, elég egyet xD] No persze a \"lassabb\" az még így is csak nanosecben mérhetõ.
 
    new string[256], T1, T2;
new a[32] = \"Magyar Állami Operaház\";
new b[32] = \"Budapest, Andrássy út 22.\";
new c[32] = \"operákra, balettekre\";
new a2[32] = \"Csóró Kocsma\";
new b2[32] = \"Bucsaröcsöge, Sosevolt út 666.\";
new c2[32] = \"vikingmetálra és goth metálra\";
T1 = GetTickCount();
for(new i=0; i< 100000; i++)
{
    new r = random(2);
    format(string, sizeof(string), \"A %s (%s) Magyarország egyetlen nagy létszámú társulattal rendelkezõ és kimondottan %s szakosodott színháza.\", (r)?(a):(a2), (r)?(b):(b2), (r)?(c):(c2));
//printf(string);
}
T2 = GetTickCount();
printf(\"\\\"?:\\\" - 100000x: %d ms\", T2-T1);
T1 = GetTickCount();
for(new i=0; i< 100000; i++)
{
    new r = random(2);
    if(r)
    {
    format(string, sizeof(string), \"A %s (%s) Magyarország egyetlen nagy létszámú társulattal rendelkezõ és kimondottan %s szakosodott színháza.\", a, b, c);
}
else
{
    format(string, sizeof(string), \"A %s (%s) Magyarország egyetlen nagy létszámú társulattal rendelkezõ és kimondottan %s szakosodott színháza.\", a2, b2, c2);
}
//printf(string);
}
T2 = GetTickCount();
printf(\"if-else - 100000x: %d ms\", T2-T1);
T1 = GetTickCount();
for(new i=0; i< 100000; i++)
{
    new r = random(2);
    switch(r)
    {
    case 0: format(string, sizeof(string), \"A %s (%s) Magyarország egyetlen nagy létszámú társulattal rendelkezõ és kimondottan %s szakosodott színháza.\", a, b, c);
    case 1: format(string, sizeof(string), \"A %s (%s) Magyarország egyetlen nagy létszámú társulattal rendelkezõ és kimondottan %s szakosodott színháza.\", a2, b2, c2);
}
//printf(string);
}
T2 = GetTickCount();
printf(\"switch - 100000x: %d ms\", T2-T1);

 
Ezt a tesztet lefuttatva az eredmény:
 
[11:54:09][11:59:10] \"?:\" - 100000x: 148 ms
[11:59:10] if-else - 100000x: 138 ms
[11:59:10] switch - 100000x: 142 ms

 
Csak ha sok-sok \"?:\" van egymásba ágyazva az sokkal lassabb, mint ha sok else-if van egymásban =/

findindex
« Válasz #19 Dátum: 2012. július 25. - 15:34:53 »
+1 Show voters
Érdekes teszt, az egészben a hiba a random, nem mindegyik teszt zajlik le ugyanúgy. A következõ tesztben nem biztos hogy ugyanannyi 1 vagy 0 értéket kapunk mint az elõzõben vagy a következõben.
Na végzek egy ilyen tesztet én is kíváncsiságból. :D
EDIT:
Elkészült a teszt nagy nehezen, ennyiszer nem kellett abbahagynom egy ilyen tesztet mint most. :D
 
stock
ifteszt()
{
//   #define DEBUGMODE // <- Ellenõrzés
#define LOOP 10000000 // < -Ismétlõdések száma 10 millió
#if defined DEBUGMODE
#undef LOOP
#define LOOP 10
#endif
new
i = 0,
starttime,
changevariable;
// - ()?():() >
i = 0; starttime = GetTickCount();
for( ; i < LOOP; i++)
{
changevariable = (i % 2)?(123):(321);
#if defined DEBUGMODE
   printf(\"%s\", (i % 2)?(\"egy\"):(\"null\"));
#endif
}
printf(\"()?():() -> %dms -- changevariable: %d\\n\", GetTickCount() - starttime, changevariable);
// <-
// - if else >
i = 0; starttime = GetTickCount();
for( ; i < LOOP; i++)
{
if(i % 2)
{
   changevariable = 123;
   #if defined DEBUGMODE
      print(\"egy\");
   #endif
} else {
   changevariable = 321;
   #if defined DEBUGMODE
      print(\"null\");
   #endif
}
}
printf(\"ifelse -> %dms -- changevariable: %d\\n\", GetTickCount() - starttime, changevariable);
// <-
// - switch >
i = 0; starttime = GetTickCount();
for( ; i < LOOP; i++)
{
switch(i % 2)
{
   case 1:
   {
      changevariable = 123;
      #if defined DEBUGMODE
         print(\"egy\");
      #endif
   }
   case 0:
   {
      changevariable = 321;
      #if defined DEBUGMODE
         print(\"null\");
      #endif
   }
}
}
printf(\"switch -> %dms -- changevariable: %d\\n\", GetTickCount() - starttime, changevariable);
// <-
}

 
És az eredmény:
 
[2012.07.25 18:08:13] ()?():() -> 837ms -- changevariable: 123
[2012.07.25 18:08:14] ifelse -> 758ms -- changevariable: 123
[2012.07.25 18:08:14] switch -> 624ms -- changevariable: 123
[2012.07.25 18:08:15] ()?():() -> 810ms -- changevariable: 123
[2012.07.25 18:08:16] ifelse -> 766ms -- changevariable: 123
[2012.07.25 18:08:16] switch -> 638ms -- changevariable: 123

 
Ezek szerint gyorsabb az if else mint ahogy nevezik \"hármas operátor\"-nál, de a switch ezeknél is gyorsabb.
« Utoljára szerkesztve: 2012. július 25. - 21:11:51 írta ɐʞzssǝlosz »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal