added timing debug code

This commit is contained in:
John Wiegley 2004-08-14 00:12:59 -04:00
parent 0279827768
commit c6b82f8359
3 changed files with 90 additions and 7 deletions

22
main.cc
View file

@ -427,6 +427,14 @@ OPT_BEGIN(weighted_trend, "Z", false) {
} OPT_END(weighted_trend);
TIMER_DEF(write_cache, "writing cache file");
TIMER_DEF(report_gen, "generation of final report");
TIMER_DEF(handle_options, "configuring based on options");
TIMER_DEF(parse_files, "parsing ledger files");
TIMER_DEF(process_env, "processing environment");
TIMER_DEF(process_args, "processing command-line arguments");
TIMER_DEF(read_cache, "reading cache file");
int main(int argc, char * argv[], char * envp[])
{
#ifdef DEBUG_ENABLED
@ -438,7 +446,7 @@ int main(int argc, char * argv[], char * envp[])
// A ledger data file must be specified
TIMER_START(read_cache, "reading cache file");
TIMER_START(read_cache);
// jww (2004-08-13): use LEDGER_FILE
use_cache = std::getenv("LEDGER") != NULL;
@ -474,7 +482,7 @@ int main(int argc, char * argv[], char * envp[])
// Parse the command-line options
TIMER_START(process_args, "processing command-line arguments");
TIMER_START(process_args);
std::list<std::string> args;
@ -490,7 +498,7 @@ int main(int argc, char * argv[], char * envp[])
// Process options from the environment
TIMER_START(process_env, "processing environment");
TIMER_START(process_env);
process_environment(envp, "LEDGER_");
@ -503,7 +511,7 @@ int main(int argc, char * argv[], char * envp[])
// Read the ledger file, unless we already read it from the cache
TIMER_START(parse_files, "parsing ledger files");
TIMER_START(parse_files);
if (! use_cache || cache_dirty) {
int entry_count = 0;
@ -552,7 +560,7 @@ int main(int argc, char * argv[], char * envp[])
std::string command = *arg++;
TIMER_START(handle_options, "configuring based on options");
TIMER_START(handle_options);
if (command == "balance" || command == "bal" || command == "b")
command = "b";
@ -708,7 +716,7 @@ int main(int argc, char * argv[], char * envp[])
// Walk the entries based on the report type and the options
TIMER_START(report_gen, "generation of final report");
TIMER_START(report_gen);
if (command == "b") {
std::auto_ptr<item_handler<transaction_t> > formatter;
@ -834,7 +842,7 @@ int main(int argc, char * argv[], char * envp[])
// Save the cache, if need be
TIMER_START(write_cache, "writing cache file");
TIMER_START(write_cache);
if (use_cache && cache_dirty) {
std::string cache_file = ledger_cache_file();

View file

@ -3,6 +3,7 @@
#include "valexpr.h"
#include "error.h"
#include "option.h"
#include "timing.h"
#include <fstream>
#include <sstream>
@ -222,6 +223,11 @@ bool finalize_entry(entry_t * entry)
return ! balance;
}
TIMER_DEF(entry_finish, "finalizing entry");
TIMER_DEF(entry_xacts, "parsing transactions");
TIMER_DEF(entry_details, "parsing entry details");
TIMER_DEF(entry_date, "parsing entry date");
entry_t * parse_entry(std::istream& in, account_t * master)
{
entry_t * curr = new entry_t;
@ -232,13 +238,19 @@ entry_t * parse_entry(std::istream& in, account_t * master)
// Parse the date
TIMER_START(entry_date);
char * next = next_element(line);
if (! quick_parse_date(line, &curr->date))
throw parse_error(path, linenum, "Failed to parse date");
TIMER_STOP(entry_date);
// Parse the optional cleared flag: *
TIMER_START(entry_details);
if (*next == '*') {
curr->state = entry_t::CLEARED;
next = skip_ws(++next);
@ -258,19 +270,29 @@ entry_t * parse_entry(std::istream& in, account_t * master)
curr->payee = next;
TIMER_STOP(entry_details);
// Parse all of the transactions associated with this entry
TIMER_START(entry_xacts);
while (! in.eof() && (in.peek() == ' ' || in.peek() == '\t'))
if (transaction_t * xact = parse_transaction(in, master, curr))
curr->add_transaction(xact);
TIMER_STOP(entry_xacts);
// If there were no transactions, throw away the entry
TIMER_START(entry_finish);
if (curr->transactions.empty() || ! finalize_entry(curr)) {
delete curr;
return NULL;
}
TIMER_STOP(entry_finish);
return curr;
}

53
timing.h Normal file
View file

@ -0,0 +1,53 @@
#ifndef _TIMING_H
#define _TIMING_H
#include "debug.h"
#include <ctime>
namespace ledger {
class timing_t
{
public:
std::clock_t begin;
std::clock_t cumulative;
std::string file;
unsigned long line;
std::string symbol;
std::string category;
timing_t(const std::string& _symbol, const std::string& _category)
: begin(0), cumulative(0), symbol(_symbol), category(_category) {}
~timing_t() {
std::string cls = "timing.results.";
cls += symbol;
DEBUG_PRINT(cls.c_str(), file << ":" << line << ": "
<< category << " = "
<< (double(cumulative) / double(CLOCKS_PER_SEC)) << "s");
}
void start(const std::string& _file, unsigned long _line) {
file = _file;
line = _line;
begin = std::clock();
}
void stop() {
cumulative += std::clock() - begin;
}
};
#ifdef DEBUG_ENABLED
#define TIMER_DEF(sym, cat) static timing_t sym(#sym, cat)
#define TIMER_START(sym) sym.start(__FILE__, __LINE__)
#define TIMER_STOP(sym) sym.stop()
#else
#define TIMER_START(sym, cat)
#define TIMER_STOP(sym)
#endif
} // namespace ledger
#endif // _TIMING_H