Add trace_performance and trace_performance_since macros that print file name, line number, time and an optional printf-formatted text to the file specified in environment variable GIT_TRACE_PERFORMANCE. Unless enabled via GIT_TRACE_PERFORMANCE, these macros have no noticeable impact on performance, so that test code may be shipped in release builds. MSVC: variadic macros (__VA_ARGS__) require VC++ 2005 or newer. Simple use case (measure one code section): uint64_t start = getnanotime(); /* code section to measure */ trace_performance_since(start, "foobar"); Medium use case (measure consecutive code sections): uint64_t start = getnanotime(); /* first code section to measure */ start = trace_performance_since(start, "first foobar"); /* second code section to measure */ trace_performance_since(start, "second foobar"); Complex use case (measure repetitive code sections): uint64_t t = 0; for (;;) { /* ignore */ t -= getnanotime(); /* code section to measure */ t += getnanotime(); /* ignore */ } trace_performance(t, "frotz"); Signed-off-by: Karsten Blees <blees@xxxxxxx> --- cache.h | 18 ++++++++++++++++++ trace.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/cache.h b/cache.h index 48fc616..cb856d9 100644 --- a/cache.h +++ b/cache.h @@ -1363,6 +1363,24 @@ __attribute__((format (printf, 2, 3))) extern void trace_printf_key(const char *key, const char *fmt, ...); extern void trace_strbuf(const char *key, const struct strbuf *buf); extern uint64_t getnanotime(void); +__attribute__((format (printf, 4, 5))) +extern uint64_t trace_performance_file_line(const char *file, int lineno, + uint64_t nanos, const char *fmt, ...); + +/* + * Prints specified time (in nanoseconds) if GIT_TRACE_PERFORMANCE is enabled. + * Returns current time in nanoseconds. + */ +#define trace_performance(nanos, ...) \ + trace_performance_file_line(__FILE__, __LINE__, nanos, __VA_ARGS__) + +/* + * Prints time since 'start' if GIT_TRACE_PERFORMANCE is enabled. + * Returns current time in nanoseconds. + */ +#define trace_performance_since(start, ...) \ + trace_performance_file_line(__FILE__, __LINE__, \ + getnanotime() - (start), __VA_ARGS__) void packet_trace_identity(const char *prog); diff --git a/trace.c b/trace.c index 3d72084..1b1903b 100644 --- a/trace.c +++ b/trace.c @@ -269,3 +269,43 @@ inline uint64_t getnanotime(void) return now; } } + +static const char *GIT_TRACE_PERFORMANCE = "GIT_TRACE_PERFORMANCE"; + +static inline int trace_want_performance(void) +{ + static int enabled = -1; + if (enabled < 0) + enabled = trace_want(GIT_TRACE_PERFORMANCE); + return enabled; +} + +/* + * Prints performance data if environment variable GIT_TRACE_PERFORMANCE is + * set, otherwise a NOOP. Returns the current time in nanoseconds. + */ +__attribute__((format (printf, 4, 5))) +uint64_t trace_performance_file_line(const char *file, int lineno, + uint64_t nanos, const char *fmt, ...) +{ + struct strbuf buf = STRBUF_INIT; + va_list args; + + if (!trace_want_performance()) + return 0; + + strbuf_addf(&buf, "performance: at %s:%i, time: %.9f s", file, lineno, + (double) nanos / 1000000000); + + if (fmt && *fmt) { + strbuf_addstr(&buf, ": "); + va_start(args, fmt); + strbuf_vaddf(&buf, fmt, args); + va_end(args); + } + strbuf_addch(&buf, '\n'); + + trace_strbuf(GIT_TRACE_PERFORMANCE, &buf); + strbuf_release(&buf); + return getnanotime(); +} -- 1.9.2.msysgit.0.493.g47a82c3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html