• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

langsamer delete operator in c++ ?

borgg

Newbie
Hallo,

Hier gibt es doch bestimmt einige c++-Xperts.

Ich hab bei einem Programm bei mir festgestellt, daß das "deleten" von Feldern erheblich länger dauert, als das Anlegen von Feldern. Bei dem Programm werden oft große Datenfelder unterschiedlicher Größe angelegt und wieder gelöscht. Daher ist dieser Umstand sehr ungünstig.

Ist das Normal, daß der Unterschied bei Faktor 10-20 liegt? Oder begehe ich hier an irgendeiner Stelle einen grundlegenden Fehler!?

Danke für die Hilfe.

code:
Code:
QTime t; 

t.start();
double** data = new double*[1300];
for (int i=0;i<1300;i++) data[i] = new double[1300];
cout << "needed to create: " << t.elapsed() << " mseconds"<<endl;

t.start();
for (int j=0;j<1300;j++)  delete [] data[j];
delete [] data;
cout << "needed to delete: " << t.elapsed() << " mseconds"<<endl;

Ausgabe:
Code:
needed to create: 31 mseconds
needed to delete: 484 mseconds
 

Fat_Fox

Hacker
also, nach meiner erfahrung ist es normal das das löschen eines arrays länger dauert als eins zu dimensinieren...wie sich aber die größenordnungen verhalten kann ich nicht sagen zumal ich mich mit c nicht auskenne, fürs basic gilt meine obige behauptung aber.
 

TeXpert

Guru
hmm, an sich kann ich das nicht bestätigen... ich hab mal schnell was runtergehackt (ohne den QT-Bloat...)

Code:
#include <iostream>
#include <ctime>


int main(int argi, char *argv){

  struct timespec ts_start, ts_end;  

  double** data = 0;
  
  clock_gettime(CLOCK_REALTIME, &ts_start);
  data = new double*[3000];
  for (int i=0;i<3000;i++) 
    data[i] = new double[3000];
  clock_gettime(CLOCK_REALTIME, &ts_end);
	
  std::cout << "create:"<<std::endl;
  std::cout << "start-secs: " << int(ts_start.tv_sec)<<std::endl;
  std::cout << "start-nsec: " << ts_start.tv_nsec<<std::endl;
  std::cout << "end-secs: " << int(ts_end.tv_sec)<<std::endl;
  std::cout << "end-nsec: " << ts_end.tv_nsec<<std::endl;
  std::cout << "nsec-diff: " << (ts_end.tv_nsec - ts_start.tv_nsec) <<std::endl;
  std::cout << std::endl;

  long creatediff = (ts_end.tv_nsec - ts_start.tv_nsec);

  clock_gettime(CLOCK_REALTIME, &ts_start);
  for (int i=0;i<3000;i++)  
  	delete [] data[i];
  delete [] data;
  clock_gettime(CLOCK_REALTIME, &ts_end);
	
  std::cout << "delete:"<<std::endl;
  std::cout << "start-secs: " << int(ts_start.tv_sec)<<std::endl;
  std::cout << "start-nsec: " << ts_start.tv_nsec<<std::endl;
  std::cout << "end-secs: " << int(ts_end.tv_sec)<<std::endl;
  std::cout << "end-nsec: " << ts_end.tv_nsec<<std::endl;
  std::cout << "nsec-diff: " << (ts_end.tv_nsec - ts_start.tv_nsec) <<std::endl;
  std::cout << std::endl;
  std::cout << "summary:"<<std::endl;
  std::cout << "create: nsec-diff: " << creatediff <<std::endl;
  std::cout << "delete: nsec-diff: " << (ts_end.tv_nsec - ts_start.tv_nsec) <<std::endl;
  std::cout << std::endl;

  return 0;
}

ergebnisse:
$ ./timer
create:
start-secs: 1121244340
start-nsec: 714287000
end-secs: 1121244340
end-nsec: 750478000
nsec-diff: 36191000

delete:
start-secs: 1121244340
start-nsec: 751839000
end-secs: 1121244340
end-nsec: 756078000
nsec-diff: 4239000

summary:
create: nsec-diff: 36191000
delete: nsec-diff: 4239000
 
OP
B

borgg

Newbie
irgendwas ist an meinem System schräg

Mit:

Code:
double* dataEasy = new double[arr_size*arr_size];
double** dataEasyAccess = new double*[arr_size];
for (int k=0;k<arr_size;k++)  dataEasyAccess[k] = dataEasy + k*arr_size

komme ich auf akzeptable Ergebnisse.... comp.lang.c++ liefert das "selbe" wie du. Die sagen da auch alle, daß es bei ihnen schnell geht.
 
Oben