Files correlati : ba1, ba2 Ricompilazione Demo : [ ] Commento : Aggiunte toolbar moderne ai programmi di installazione git-svn-id: svn://10.65.10.50/trunk@17359 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			372 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			372 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						|
#include <progind.h>
 | 
						|
#include <recarray.h>
 | 
						|
#include <relation.h>
 | 
						|
#include <tabutil.h>
 | 
						|
#include <toolfld.h>
 | 
						|
#include <reputils.h>
 | 
						|
#include <urldefid.h>
 | 
						|
 | 
						|
class TProfiler_mask : public TMask
 | 
						|
{
 | 
						|
public:
 | 
						|
  TProfiler_mask();
 | 
						|
};
 | 
						|
 | 
						|
TProfiler_mask::TProfiler_mask() : TMask(TR("Test"), 1, 60, 9)
 | 
						|
{
 | 
						|
  add_button_tool(DLG_OK, PR("Elabora"), TOOL_ELABORA);
 | 
						|
  add_button_tool(DLG_INFO, PR("Info"), TOOL_INFO);
 | 
						|
  add_button_tool(DLG_HELP, PR("Help"), TOOL_HELP);
 | 
						|
  add_button_tool(DLG_QUIT, "", TOOL_QUIT);
 | 
						|
  
 | 
						|
  TToken_string codes, items;
 | 
						|
  codes.add(0); items.add(TR("Tutti i test"));
 | 
						|
  codes.add(1); items.add(TR("Lettura sequenziale tabella"));
 | 
						|
  codes.add(2); items.add(TR("Lettura cursore su chiave primaria"));
 | 
						|
  codes.add(3); items.add(TR("Lettura cursore con ordinamento fuori chiave"));
 | 
						|
  codes.add(4); items.add(TR("Lettura causale con cache"));
 | 
						|
  codes.add(5); items.add(TR("Creazione e cancellazione records"));
 | 
						|
  add_radio(101, 0, TR("@bSelezione test"), 1, 1, 58, codes, items);
 | 
						|
  add_number(102, 0, PR("Numero di iterazioni"), 1, 0, 3, "U");
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// Testfile
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TTest_application : public TSkeleton_application
 | 
						|
{
 | 
						|
  TProgind* _pi;
 | 
						|
 | 
						|
  clock_t start_timer() const;
 | 
						|
 | 
						|
  clock_t start_progind(const long items, const char* prompt);
 | 
						|
  clock_t stop_progind();
 | 
						|
 | 
						|
protected:
 | 
						|
  bool test1(TLog_report& log);
 | 
						|
  bool test2(TLog_report& log);
 | 
						|
  bool test3(TLog_report& log);
 | 
						|
  bool test4(TLog_report& log);
 | 
						|
  bool test5(TLog_report& log);
 | 
						|
 | 
						|
 
 | 
						|
public:
 | 
						|
  bool test(int n, TLog_report& log);
 | 
						|
  virtual void main_loop();
 | 
						|
 | 
						|
  TTest_application() : _pi(NULL) { }
 | 
						|
};
 | 
						|
 | 
						|
clock_t TTest_application::start_timer() const
 | 
						|
{
 | 
						|
  clock_t t = clock();
 | 
						|
  while (clock() == t);
 | 
						|
  t = clock();
 | 
						|
  return t;
 | 
						|
}
 | 
						|
 | 
						|
clock_t TTest_application::start_progind(const long items, const char* prompt)
 | 
						|
{
 | 
						|
  CHECK(_pi == NULL, "Double progress indicator");
 | 
						|
  _pi = new TProgind(items, prompt, true, true);
 | 
						|
  return start_timer();
 | 
						|
}
 | 
						|
 | 
						|
clock_t TTest_application::stop_progind()
 | 
						|
{
 | 
						|
  clock_t t = clock();
 | 
						|
  if (_pi != NULL)
 | 
						|
  {
 | 
						|
    delete _pi;
 | 
						|
    _pi = NULL;
 | 
						|
  }
 | 
						|
  return t;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TTest_application::test1(TLog_report& log)
 | 
						|
{          
 | 
						|
  bool ok = true;
 | 
						|
  TLocalisamfile tab(LF_COMUNI);
 | 
						|
  
 | 
						|
  TRecnotype r = 0;
 | 
						|
  TString80 msg;
 | 
						|
	
 | 
						|
  const int times = 10;
 | 
						|
	const clock_t start = start_progind(times, TR("Lettura file comuni"));
 | 
						|
  for (int i = 0; i < times; i++)
 | 
						|
  {
 | 
						|
	  for (tab.first(); tab.good(); tab.next())
 | 
						|
      r++;
 | 
						|
 | 
						|
	  msg.format(FR("%ld records %ld msec"), r, clock() - start);             
 | 
						|
		
 | 
						|
		_pi->set_text(msg);
 | 
						|
		if (!_pi->addstatus(1)) 
 | 
						|
    {
 | 
						|
      log.log(1, TR("Interrotto dall'utente"));
 | 
						|
      ok = false;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
	
 | 
						|
	const clock_t t = stop_progind() - start;
 | 
						|
	msg.format("Lettura file comuni - "
 | 
						|
             "%ld records in %ld msec - %lg records per sec", r, t, 1000.0*r/t);             
 | 
						|
	log.log(0, msg);
 | 
						|
	return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TTest_application::test2(TLog_report& log)
 | 
						|
{            
 | 
						|
  bool ok = true;
 | 
						|
  TRelation rel(LF_COMUNI);
 | 
						|
  TCursor tab(&rel);
 | 
						|
 | 
						|
  const TRecnotype n = tab.items();
 | 
						|
 | 
						|
  tab.freeze();
 | 
						|
  
 | 
						|
  clock_t start;
 | 
						|
  TRecnotype r = 0;
 | 
						|
  TString80 msg;
 | 
						|
	{
 | 
						|
    const int times = 10;
 | 
						|
		TProgind p(times, TR("Lettura cursore comuni"), TRUE, TRUE);
 | 
						|
		start = start_timer();
 | 
						|
    for (int i = 0; i < times; i++)
 | 
						|
    {
 | 
						|
		  for (tab = 0; tab.pos() < n; ++tab)
 | 
						|
        r++;
 | 
						|
		  
 | 
						|
      msg.format("Lettura cursore comuni\n%ld records %ld msec", r, clock() - start);             
 | 
						|
		  p.set_text(msg);
 | 
						|
		  if (!p.addstatus(1))
 | 
						|
      {
 | 
						|
        log.log(1, TR("Interrotto dall'utente"));
 | 
						|
        ok = false;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
	}
 | 
						|
	const clock_t t = clock() - start;
 | 
						|
  msg.format("Lettura cursore comuni: %ld records in %ld msec - %lg records per sec\n", 
 | 
						|
             r, t, 1000.0*r/t);             
 | 
						|
	log.log(0, msg);
 | 
						|
	return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TTest_application::test3(TLog_report& log)
 | 
						|
{            
 | 
						|
  bool ok = true;
 | 
						|
  TRelation rel(LF_COMUNI);
 | 
						|
  TSorted_cursor tab(&rel, "CAPCOM|DENCOM");
 | 
						|
 | 
						|
  clock_t istart = start_timer();
 | 
						|
  const TRecnotype n = tab.items();
 | 
						|
  clock_t istop = clock() - istart;
 | 
						|
 | 
						|
  tab.freeze();
 | 
						|
  
 | 
						|
  clock_t start;
 | 
						|
  TRecnotype r = 0;
 | 
						|
  TString256 msg;
 | 
						|
	{
 | 
						|
    const int times = 10;
 | 
						|
		TProgind p(times, TR("Lettura cursore C.A.P."), TRUE, TRUE);
 | 
						|
		start = start_timer();
 | 
						|
    for (int i = 0; i < times; i++)
 | 
						|
    {
 | 
						|
		  for (tab = 0; tab.pos() < n; ++tab)
 | 
						|
        r++;
 | 
						|
		  
 | 
						|
      msg.format("Lettura cursore C.A.P.\n%ld records %ld msec", r, clock() - start);             
 | 
						|
			p.set_text(msg);
 | 
						|
			if (!p.addstatus(1)) 
 | 
						|
      {
 | 
						|
        log.log(1, TR("Interrotto dall'utente"));
 | 
						|
        ok = false;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
	}
 | 
						|
	const clock_t t = clock() - start;
 | 
						|
	msg.format("Lettura cursore ordinato %ld records in %ld msec - %lg records per sec - "
 | 
						|
             "%ld msec for initialization", 
 | 
						|
             r, t, 1000.0*r/t, istop);             
 | 
						|
	log.log(0, msg);
 | 
						|
	return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TTest_application::test4(TLog_report& log)
 | 
						|
{            
 | 
						|
  bool ok = true;
 | 
						|
  long r = 0;
 | 
						|
  srand(r);
 | 
						|
  TString8 cod;
 | 
						|
 | 
						|
  clock_t start;
 | 
						|
	{
 | 
						|
    const int times = 10;
 | 
						|
		TProgind p(times, TR("Lettura casuale tramite cache"), TRUE, TRUE);
 | 
						|
    cache().get(LF_COMUNI, cod);  // Inizializzazione
 | 
						|
		start = start_timer();
 | 
						|
    for (int i = 0; i < times; i++)
 | 
						|
    {
 | 
						|
      for (long j = 0; j < 10000; j++)
 | 
						|
      {
 | 
						|
        cod.format(" |%c%03d", 'A'+rand()%8, rand() % 1000);
 | 
						|
        cache().get(LF_COMUNI, cod);
 | 
						|
        r++;
 | 
						|
      }
 | 
						|
			if (!p.addstatus(1)) 
 | 
						|
      {
 | 
						|
        log.log(1, TR("Interrotto dall'utente"));
 | 
						|
        ok = false;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
	}
 | 
						|
 | 
						|
	const clock_t t = clock() - start;
 | 
						|
  TString msg;
 | 
						|
	msg.format("Lettura casuale di %ld records in %ld msec - %lg records per sec", 
 | 
						|
             r, t, 1000.0*r/t);             
 | 
						|
	log.log(0, msg);
 | 
						|
	return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TTest_application::test5(TLog_report& log)
 | 
						|
{
 | 
						|
  bool ok = true;
 | 
						|
  TString msg;
 | 
						|
  TRecnotype n = 200;
 | 
						|
 | 
						|
  if (n > 0)
 | 
						|
  {
 | 
						|
    TTable tab("CZZ");
 | 
						|
 	  msg.format("Creazione di %ld records", n);
 | 
						|
 	  const clock_t start = start_progind(n, msg);
 | 
						|
    int i;
 | 
						|
    for (i = 0; i < n; i++)
 | 
						|
    {
 | 
						|
      tab.put("CODTAB", i+1);
 | 
						|
      tab.write();
 | 
						|
			if (!_pi->addstatus(1)) 
 | 
						|
      {
 | 
						|
        log.log(1, TR("Interrotto dall'utente"));
 | 
						|
        ok = false;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    const clock_t t = stop_progind() - start;
 | 
						|
    msg.format("Scritti %ld records in %ld msec - %lg records per sec", i, t, 1000.0*i/t);             
 | 
						|
	  log.log(0, msg);
 | 
						|
  }
 | 
						|
  
 | 
						|
  if (n > 0)
 | 
						|
  {
 | 
						|
    TRelation rel("CZZ");
 | 
						|
    TCursor cur(&rel);
 | 
						|
    n = cur.items();
 | 
						|
    cur.freeze();
 | 
						|
 | 
						|
   	msg.format("Cancellazione %ld records", n);
 | 
						|
		const clock_t start = start_progind(n, msg);
 | 
						|
    for (cur = 0; cur.pos() < n; ++cur)
 | 
						|
    {
 | 
						|
      cur.file().remove();
 | 
						|
			if (!_pi->addstatus(1)) 
 | 
						|
      {
 | 
						|
        log.log(1, TR("Interrotto dall'utente"));
 | 
						|
        ok = false;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
	  const clock_t t = stop_progind() - start;
 | 
						|
	  msg.format("Cancellati %ld records in %ld msec - %lg records per sec", n, t, 1000.0*n/t);             
 | 
						|
	  log.log(0, msg);
 | 
						|
  }
 | 
						|
	return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TTest_application::test(int n, TLog_report& log)
 | 
						|
{
 | 
						|
  bool ok = false;
 | 
						|
  switch (n)
 | 
						|
  {
 | 
						|
  case  1: ok = test1(log); break;
 | 
						|
  case  2: ok = test2(log); break;
 | 
						|
  case  3: ok = test3(log); break;
 | 
						|
  case  4: ok = test4(log); break;
 | 
						|
  case  5: ok = test5(log); break;
 | 
						|
  default: ok = false;   break;
 | 
						|
  }
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TTest_application::main_loop()
 | 
						|
{
 | 
						|
  int te = -1;
 | 
						|
  int ti = 3;
 | 
						|
  
 | 
						|
  for (int a = argc()-1; a > 1; a--) 
 | 
						|
  {
 | 
						|
    const TFixed_string t(argv(a));
 | 
						|
    if (t.starts_with("test="))
 | 
						|
      te = atoi(t.mid(5)); else
 | 
						|
    if (t.starts_with("times="))
 | 
						|
      ti = atoi(t.mid(6));
 | 
						|
  }
 | 
						|
 | 
						|
  const bool interactive = te < 0;
 | 
						|
 | 
						|
  while (true)
 | 
						|
  {
 | 
						|
    if (interactive)
 | 
						|
    {
 | 
						|
      TProfiler_mask m;
 | 
						|
      m.set(101, te);
 | 
						|
      m.set(102, ti);
 | 
						|
      if (m.run() == K_QUIT)
 | 
						|
        break;
 | 
						|
      te = m.get_int(101);
 | 
						|
	    ti = m.get_int(102);
 | 
						|
      if (ti <= 0) 
 | 
						|
        ti = 1;
 | 
						|
    }
 | 
						|
 | 
						|
    TLog_report log(TR("Report"));
 | 
						|
 | 
						|
	  bool ok = true;
 | 
						|
	  for (int t = 1; ok && t <= 5; t++)
 | 
						|
	  {
 | 
						|
      if (te <= 0 || te == t)
 | 
						|
      {
 | 
						|
        log.log(0, "");
 | 
						|
        for (int i = 0; ok && i < ti; i++)
 | 
						|
		      ok = test(t, log);
 | 
						|
	    }
 | 
						|
	  }
 | 
						|
 | 
						|
    if (interactive)
 | 
						|
      log.preview();
 | 
						|
    else
 | 
						|
      break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
int ba1200(int argc, char** argv)
 | 
						|
{
 | 
						|
  TTest_application a;
 | 
						|
  a.run(argc, argv, TR("Performance profiler"));
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 |