Revision: 1010
Author: tim.bunce
Date: Tue Jan  5 10:08:20 2010
Log: Changed subroutine profiler to be slightly more efficient.
(Even a simple sprintf is surprisingly expensive.)

http://code.google.com/p/perl-devel-nytprof/source/detail?r=1010

Modified:
 /trunk/Changes
 /trunk/NYTProf.xs

=======================================
--- /trunk/Changes      Tue Jan  5 09:39:16 2010
+++ /trunk/Changes      Tue Jan  5 10:08:20 2010
@@ -15,6 +15,7 @@

 =head2 Changes in Devel::NYTProf 3.02

+  Changed subroutine profiler to be slightly more efficient.
   Changed some tests to be more informative on failure.

   Updated docs to include a note about timing on Windows.
=======================================
--- /trunk/NYTProf.xs   Mon Dec 28 13:49:46 2009
+++ /trunk/NYTProf.xs   Tue Jan  5 10:08:20 2010
@@ -1839,10 +1839,29 @@
     if (subr_call_key_len >= sizeof(subr_call_key))
         croak("panic: NYTProf buffer overflow on %s\n", subr_call_key);

- if ( (sprintf(called_subname_pv, "%s::%s", subr_entry->called_subpkg_pv, - (subr_entry->called_subnam_sv) ? SvPV_nolen(subr_entry->called_subnam_sv) : "(null)")
-            >= sizeof(called_subname_pv)) )
- croak("~ called_subname_pv buffer overflow on '%s'\n", called_subname_pv);
+    /* compose called_subname_pv as "${pkg}::${sub}" avoiding sprintf */
+    STMT_START {
+        STRLEN len;
+        char *p;
+        char *called_subname_pvp = called_subname_pv;
+
+        p = subr_entry->called_subpkg_pv;
+        while (*p)
+            *called_subname_pvp++ = *p++;
+        *called_subname_pvp++ = ':';
+        *called_subname_pvp++ = ':';
+        if (subr_entry->called_subnam_sv) {
+            p = SvPV(subr_entry->called_subnam_sv, len);
+        }
+        else {
+            p = "(null)"; len = 6;
+        }
+        memcpy(called_subname_pvp, p, len);
+        called_subname_pvp += len;
+        *called_subname_pvp++ = '\0';
+ if (called_subname_pvp >= called_subname_pv+sizeof(called_subname_pv)) + croak("panic: called_subname_pv buffer overflow on '%s'\n", called_subname_pv);
+    } STMT_END;

/* { called_subname => { "caller_subname[fid:line]" => [ count, incl_time, ... ] } } */ sv_tmp = *hv_fetch(sub_callers_hv, called_subname_pv, strlen(called_subname_pv), 1);
-- 
You've received this message because you are subscribed to
the Devel::NYTProf Development User group.

Group hosted at:  http://groups.google.com/group/develnytprof-dev
Project hosted at:  http://perl-devel-nytprof.googlecode.com
CPAN distribution:  http://search.cpan.org/dist/Devel-NYTProf

To post, email:  [email protected]
To unsubscribe, email:  [email protected]

Reply via email to