Newsgroup: it.comp.lang.delphi
Titolo: Anomalia anomala sui tempi di esecuzione

Ciao
O sono io che sto dando i numeri o qui c'è qualcosa che non va.
Oppure non conosco ancora abbastanza bene Delphi.
Dunque, ho una funzione che opera su un array di oggetti.
Determina la posizione di inserimento di un nuovo oggetto e sposta gli
elementi dell'array per creare spazio.
for i := n downto i1 + 1 do
  aoList[i] := aoList[i - 1];
Sono tutti puntatori quindi non dovrebbero esserci problemi.
Per stressare la funzione ho provato ad inserire 10000 oggetti ottenendo un
tempo di esecuzione di circa 30 s.
Bene il seguente codice impiega circa 200 ms!!!
dummy();
for i := n downto i1 + 1 do
  aoList[i] := aoList[i - 1];
con
function Dummy():integer;
 var
   a : array of string;
 begin
   setlength(a,1);
    a[0]:='xxxxxxxxxxxxxxxxxxxxxxxxxxx';
    result:=0;
  end;
Cosa cavolo succede????
Dummy è ottenuta da una funzione di profiling e il codice è il minimo
indispesabile perchè l'effetto si verifichi.
Qualcuno mi sa dare una spiegazione?
Grazie
GG

 ha scritto nel messaggio
news:a26jmj$t5m$1...@fe1.cs.interbusiness.it...


Non credo sia un problema di correttezza del codice, almeno spero.
Mi chiedo se esiste qualche fenomeno noto di allocazione di memoria,
ottimizzazione o altro che possa spiegare una differenza così notevole nei
tempi di esecuzione.
La cosa strana è che dentro la funzione Dummy deve esserci proprio quel
codice altrimenti i tempi sono alti.
Boh!
Ciao
GG
"{MSX}" <nlugat...@THISinwind.it> wrote in message
news:gPA18.5738$tl3.1...@twister2.libero.it...


 Qualcuno mi sa dare una spiegazione?
Quale e' esattamente il problema?
a me quanto segue da' sempre lo stesso valore (+/- 2400 ms) sia con
Dummy sia senza:
Saluti
Paolo Arosio
procedure TForm1.Button1Click(Sender: TObject);
var aList: array of Pointer;
    i, j, insertionIndex: integer;
    start, stop: cardinal;
begin
  SetLength(aList, 10000);
  try
    // inizializza la lista
    for i := 0 to High(aList) do
      aList[i] := nil;
    start := getTickCount;
    Dummy();
    // simula 'inserzione' di 10000 elementi
    for i := 0 to High(aList) do begin
      // punto inserzione pseudo casuale:
      insertionIndex := Trunc(Random(High(aList) - 1));
      // sposta elementi, eliminando l'ultimo
      for j := High(aList) downto insertionIndex + 1 do
        aList[i] := aList[i - 1];
      // inserisce nuovo elemento
      aList[insertionIndex] := Pointer(insertionIndex);
    end;
    stop := GetTickCount;
    Memo1.Lines.Add('Tempo: ' + inttostr(stop -start) + 'ms');
  finally
    Finalize(aList);
  end;
end;

 Dummy sia senza:
Dovrebbe essere così.
Anzi il tempo dovrebbe aumentare in presenza della Dummy()
Pointer(insertionIndex) non è un oggetto.
Prova con oggetti.
Potrebbe essere un problema di riferimenti.
Se a te il problema non si verifica, boh!
Non so proprio cosa pensare.
Prima o poi scoprirò il motivo.
Misteri della programmazione.
Postare tutto il codice mi sembra poco fattibile.
Ciao
GG

 Prima o poi scoprirň il motivo.
Da' un'occhiata alla finestra di debug: il codice non dovrebbe essere
troppo complesso da decifrare.
Saluti
Paolo Arosio

 troppo complesso da decifrare.
Prima o poi imparerň anche l'assembler. :-)
Ciao
GG

 semplice copia di puntatori.
Negativo. Gli oggetti in Delphi non sono trattati come le stringhe.
Saluti
Paolo Arosio