Entwickler-Ecke

Algorithmen, Optimierung und Assembler - if clauses zu langsam optiemierungsbedarf


Opfer15 - Mo 28.08.06 19:05
Titel: if clauses zu langsam optiemierungsbedarf
so ich hab jetzt mal nen txt zu sql converter für mich gebaut und nun convertiert er halt 35 mb große Textdateien und da ich alles mit if sätzen gelöst habe ist das ziemlich langsam geworden kann ich da irgendwie abhilfe schaffen weil 1-2h möchte ich net für ne einfach convertierung warten (bei amd 64 3700+ wohlgemerkt :P);

so hier nen bsp.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
if pos('[creature', sl_scp[I]) > 0 then
      begin
       //if found do save in given format
      end;
    if pos('model', sl_scp[I]) > 0 then
      begin
      modelid := sl_scp[I];
      Delete(modelid, 16);
      end;
    if pos('name', sl_scp[I]) > 0 then
      begin
      name := sl_scp[I];
      Delete(name, 15);
      end;
    if pos('guild', sl_scp[I]) > 0 then
      begin
      subname := sl_scp[I];
      Delete(modelid, 16);
      end;


oder aber auch



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
if pos('SPAWN', sl_cr[I]) > 0 then              //wenn spawn gefunden dann
          if pos('SPAWN_GOBJ', sl_cr[I]) > 0 then
          else
          if pos('SPAWNDIST', sl_cr[I]) > 0 then
          else     //wenn spawndist gefunden dann tue nichts dann aber
          if pos('SPAWNTIME', sl_cr[I]) > 0 then          //wenn spawntime in min und max splitten
          begin
            sl_delimit.Delimiter := ' ';
            sl_delimit.DelimitedText := sl_cr[I];
            spawntimemin := sl_delimit[0];
            Delete(spawntimemin, 110);
            spawntimemax := sl_delimit[1];
          end
          else
          begin
            sl_delimit.Delimiter := ' ';
            sl_delimit.DelimitedText := sl_cr[I];
            ID := sl_delimit[0];
            Delete(ID, 16);
            crI := sl_scp.IndexOf('[Creature ' + ID + ']');
            if crI < 0 then else
            for crI := crI to crI+40 do
            begin
            if foundmana > 0 then
            if foundhealth > 0 then break else
            if pos('maxhealth= ', sl_scp[crI]) < 0 then
            if foundhealth > 0 then else
             begin
             health := sl_scp[crI];
             Delete(health, 110);
             foundhealth := 1
             end;
            if pos('maxmana= ', sl_scp[crI]) < 0 then
            if foundmana > 0 then else
             begin
             mana := sl_scp[crI];
             Delete(mana, 18);
             foundmana := 1;
             end;


Wundert euch nicht über verwirrende Kommentare ^^ und für suchlustige irgendwo hab ich in diesem Code ein break versteckt was aufgrund mangelnder Programmierkenntnisse nicht funktioneiert :P
So genug der grausigen rechtschreibung und TIA hoffe was zu hören auch wenn ich nur was verlange ^^


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Mo 28.08.2006 um 20:06


BenBE - Mo 28.08.06 19:14

Wie speicherst Du die Daten in die Datenbank? Zeig mal ein wenig mehr Quelltext der Konvertierungsroutine, ich denk, der Fehler liegt an einer anderen Stelle ...


Opfer15 - Mo 28.08.06 19:22

erstmal danke für die schnell antwort..

ich speichere sie nicht direkt in der Datenbank sondern mache daraus ein *.sql file in dem ich die variablen die ich mit den werten aus dem text gespeichert hab ihn mysql format bring sodass einfach jedem dem ich die datei gebe seine Datenbank damit patchen kann
sieht so aus (war ganz schöne denkarbeit das zu schreiben :P)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
            s1  := '''';  //Anführungsstriche
            s2  := ', ';  //Komma mit anführungsstrichen
            sl_final.Add('(' + IntToStr(entry) + s2 + ID + s2 + '''0''' + s2 + s1 + posx + s1 + s2 + s1 +
              posy + s1 + s2 + s1 + posz + s1 + s2 + s1 + orientation + s1 + s2 + spawntimemin + s2 + spawntimemax +
              s2 + '''0''' + s2 + waypoint + s2 + s1 + posx + s1 + s2 + s1 + posy + s1 + s2 + s1 + posz + s1 + s2 +
              s1 + orientation + s1 + health + s2 + mana + s2 + '0' + s2 + '0' + s2 + npcflags + s2 + faction + s2 + s1 + s1 + '),');


falls es irgendwie auch die geschwindigkeit beinträchtigt ich hab verdammt viele variablen z.b.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
sl_delimit,sl_output:TstringList;

modelid,maxhealth,maxmana,level,faction,npcflag,speed,mindmg,maxdmg,mount,
level_max,size,bounding_radius,clase,combat_reach,typus,flag1,

equipmodel1,equipmodel2,equipmodel3,equipinfo1,equipinfo2,equipinfo3,equipslot1,
equipslot2,equipslot3,lootid,skinloot,resistance1,resistance2,resistance3,
resistance4,resistance5,resistance6,
//don't know where to get or split for data
spell1,spell2,spell3,spell4,mingold,
maxgold,name,subname,AIName,MoveName,char,ScriptName:string;

//not in use but maybe neccessary or usefull

entry,armor,rank,attackpower,baseattacktime,rangeattacktime,flags,dynamicflags,
family,trainer_typus,minrangedmg,maxrangedmg,rangedattackpower,civilian:string;


//Edit
Hello anybody there ?????? HUHU