From: Karsten Blees <karsten.blees@gmail.com>
To: Git List <git@vger.kernel.org>, msysGit <msysgit@googlegroups.com>
Subject: [RFC/PATCH v4 2/3] add trace_performance facility to debug performance issues
Date: Tue, 20 May 2014 21:11:19 +0200 [thread overview]
Message-ID: <537BA8D7.4000007@gmail.com> (raw)
In-Reply-To: <537BA806.50600@gmail.com>
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@dcon.de>
---
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
--
--
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.
You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en
---
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
next prev parent reply other threads:[~2014-05-20 19:11 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <537BA806.50600@gmail.com>
2014-05-20 19:11 ` [RFC/PATCH v4 1/3] add high resolution timer function to debug performance issues Karsten Blees
2014-05-21 7:31 ` Noel Grandin
2014-05-21 9:14 ` Karsten Blees
2014-05-21 22:14 ` Richard Hansen
2014-05-21 22:17 ` Richard Hansen
2014-05-22 1:33 ` Karsten Blees
2014-05-20 19:11 ` Karsten Blees [this message]
2014-05-21 16:58 ` [RFC/PATCH v4 2/3] add trace_performance facility " Jeff King
2014-05-21 18:34 ` Karsten Blees
2014-05-21 20:55 ` Jeff King
2014-05-20 19:11 ` [RFC/PATCH v4 3/3] add command performance tracing to debug scripted commands Karsten Blees
2014-05-21 16:55 ` Jeff King
2014-05-21 17:38 ` Junio C Hamano
2014-05-22 0:40 ` Karsten Blees
2014-05-22 9:59 ` Jeff King
2014-05-23 14:43 ` Karsten Blees
2014-05-23 20:21 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=537BA8D7.4000007@gmail.com \
--to=karsten.blees@gmail.com \
--cc=git@vger.kernel.org \
--cc=msysgit@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).