[#32676] VC++ embedded rubygems gives NoMethodError undefined method `synchronize' for Mutex — Phlip <phlip2005@...>
[I will try Bill Kelly's PDB path advice presently; this issue is more
5 messages
2010/10/03
[#32687] Re: VC++ embedded rubygems gives NoMethodError undefined method `synchronize' for Mutex
— Roger Pack <rogerdpack2@...>
2010/10/04
> This one's about...
[#32703] Re: VC++ embedded rubygems gives NoMethodError undefined method `synchronize' for Mutex
— Phlip <phlip2005@...>
2010/10/05
> > #<NoMethodError: undefined method `synchronize' for #<Mutex:0x750faa8>>
[#32698] [Ruby 1.9-Feature#3908][Open] private constant — Yusuke Endoh <redmine@...>
Feature #3908: private constant
10 messages
2010/10/05
[#32795] Call for Cooperation: CFUNC usage survey — SASADA Koichi <ko1@...>
Hi,
5 messages
2010/10/15
[#32814] WeakHash — Santiago Pastorino <santiago@...>
Hi guys,
6 messages
2010/10/15
[#32844] [Ruby 1.9-Feature#3963][Open] Map class in standard library — Thomas Sawyer <redmine@...>
Feature #3963: Map class in standard library
3 messages
2010/10/18
[#32864] [Ruby 1.9-Bug#3972][Open] r28668 breaks test/unit when combined with the testing rake task — Aaron Patterson <redmine@...>
Bug #3972: r28668 breaks test/unit when combined with the testing rake task
6 messages
2010/10/20
[#32932] Behavior of initialize in 1.9 — Aaron Patterson <aaron@...>
The behavior of initialize in 1.9 seems to have changed. Here is an irb
5 messages
2010/10/28
[#32960] [Ruby 1.9-Bug#4005][Open] YAML fails to roundtrip Time objects — Peter Weldon <redmine@...>
Bug #4005: YAML fails to roundtrip Time objects
6 messages
2010/10/29
[#32976] Improve MinGW builds for Ruby 1.8.7, 1.9.2 and 1.9.3 — Luis Lavena <luislavena@...>
Hello,
10 messages
2010/10/30
[#32978] Re: Improve MinGW builds for Ruby 1.8.7, 1.9.2 and 1.9.3
— Aaron Patterson <aaron@...>
2010/10/30
On Sun, Oct 31, 2010 at 03:42:02AM +0900, Luis Lavena wrote:
[ruby-core:32795] Call for Cooperation: CFUNC usage survey
From:
SASADA Koichi <ko1@...>
Date:
2010-10-15 06:52:44 UTC
List:
ruby-core #32795
Hi,
I want to survey the Ruby interpreter usage.
If you have
- a real application on Ruby 1.9 trunk
if that application has a performance issue, it is welcome.
- the build environment
- time
please cooperate me to survey the CFUNC usage.
Procedure:
(1) Check out ruby trunk
$ svn co http://svn.ruby-lang.org/repos/trunk
(2) Apply a patch which is attached to this mail
(3) Build ruby interpter and install it
(4) Run application on the interpreter
Ruby prints the results into STDERR at the end of ruby process.
$ ruby [application] 2> result
(5) Send me the result with
- your environment (ruby -v)
- brief description of your application.
Download-able URL instead of attaching the result is preferable
because the result will be a huge text file.
(6) Do not forget to remove (or invalidate) installed Ruby
Result:
The results show the usage of CFUNC. CFUNC is methods implemented in C.
<format>
method_name [shallow count] [deep count]
...
</format>
[shallow count] means the number of invoking the method named
[method_name] without invoking the other methods (and blocks, and so
on). [deep count] is the number of invoking which invoke other methods.
result sample (sorted by Excel):
http://www.atdot.net/sp/view/fmjbal
application: rdoc (build process)
environment: ruby 1.9.3dev (2010-10-14) [i686-linux]
Purpose:
To tune the VM. I can find out which CFUNC method / what kind of
methods should be faster.
Thank you for.
Regards,
Koichi
----
Japanese (にほんご):
CFUNC がどんな感じで使われてるか知りたいので、パッチあてて実行して、結
果を送って下さると助かります。結果は、プロセス終了時に標準エラー出力に出
ます(正確には、スレッドが回収されるときにスレッド後のに出力)。
# 1.9 のリアルアプリケーションってどれくらいあるんだろ。
--
// SASADA Koichi at atdot dot net
Attachments (1)
cfuncsurvey.patch
(4.37 KB, text/x-diff)
Index: vm_core.h
===================================================================
--- vm_core.h (revision 29498)
+++ vm_core.h (working copy)
@@ -479,6 +482,15 @@ typedef struct rb_thread_struct
int abort_on_exception;
#ifdef USE_SIGALTSTACK
void *altstack;
+#endif
+
+#if CFUNC_FRAME_USAGE_CHECK
+ char *cfunc_usage_memo;
+ st_table *cfunc_usage_table;
+ struct cfunc_usage_record {
+ size_t shallow;
+ size_t deep;
+ };
#endif
} rb_thread_t;
Index: compile.c
===================================================================
--- compile.c (revision 29498)
+++ compile.c (working copy)
@@ -1800,6 +1800,7 @@ insn_set_specialized_instruction(rb_iseq
static int
iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
{
+ if (0)
if (iobj->insn_id == BIN(send)) {
ID mid = SYM2ID(OPERAND_AT(iobj, 0));
int argc = FIX2INT(OPERAND_AT(iobj, 1));
Index: vm.c
===================================================================
--- vm.c (revision 29498)
+++ vm.c (working copy)
@@ -8,6 +8,8 @@
**********************************************************************/
+#define CFUNC_FRAME_USAGE_CHECK 1
+
#include "ruby/ruby.h"
#include "ruby/vm.h"
#include "ruby/st.h"
@@ -1685,6 +1687,18 @@ rb_thread_mark(void *ptr)
RUBY_MARK_LEAVE("thread");
}
+static int
+cfunc_usage_print_i(st_data_t key, st_data_t val, st_data_t data)
+{
+ char *name = (char *)key;
+ struct cfunc_usage_record *record = (struct cfunc_usage_record *)val;
+
+ fprintf(stderr, "%s\t%" PRIdSIZE "\t%" PRIdSIZE "\n",
+ name, record->shallow, record->deep);
+
+ return ST_CONTINUE;
+}
+
static void
thread_free(void *ptr)
{
@@ -1708,6 +1722,14 @@ thread_free(void *ptr)
if (th->local_storage) {
st_free_table(th->local_storage);
}
+
+#if CFUNC_FRAME_USAGE_CHECK
+ if (th->cfunc_usage_table) {
+ fprintf(stderr, "CFUNC_FRAME_USAGE_CHECK: start\n");
+ st_foreach(th->cfunc_usage_table, cfunc_usage_print_i, 0);
+ fprintf(stderr, "CFUNC_FRAME_USAGE_CHECK: end\n");
+ }
+#endif
#if USE_VALUE_CACHE
{
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c (revision 29498)
+++ vm_insnhelper.c (working copy)
@@ -68,6 +68,31 @@ vm_push_frame(rb_thread_t * th, const rb
cfp->prof_time_chld = 0;
#endif
+#if CFUNC_FRAME_USAGE_CHECK
+ if (th->cfunc_usage_memo) {
+ struct cfunc_usage_record *record;
+ int found = 0;
+
+ if (st_lookup(th->cfunc_usage_table, (st_data_t)th->cfunc_usage_memo, (st_data_t *)&record)) {
+ found = 1;
+ }
+ else {
+ record = malloc(sizeof(struct cfunc_usage_record));
+ record->shallow = 0;
+ record->deep = 0;
+ }
+
+ record->deep++;
+
+ st_insert(th->cfunc_usage_table, (st_data_t)th->cfunc_usage_memo, (st_data_t)record);
+
+ if (found) {
+ free(th->cfunc_usage_memo);
+ }
+ th->cfunc_usage_memo = 0;
+ }
+#endif
+
if (VMDEBUG == 2) {
SDR();
}
@@ -399,8 +424,50 @@ vm_call_cfunc(rb_thread_t *th, rb_contro
cfp->me = me;
reg_cfp->sp -= num + 1;
+#if CFUNC_FRAME_USAGE_CHECK
+ {
+ VALUE klassname = rb_mod_name(me->klass);
+ th->cfunc_usage_memo = malloc(0x20);
+ snprintf(th->cfunc_usage_memo, 0x20 - 1, "%s#%s",
+ RTEST(klassname) ? RSTRING_PTR(klassname) : "??",
+ rb_id2name(me->called_id));
+ th->cfunc_usage_memo[0x20-1] = 0;
+
+ if (!th->cfunc_usage_table) {
+ th->cfunc_usage_table = st_init_strtable();
+ }
+ }
+#endif
+
val = call_cfunc(def->body.cfunc.func, recv, (int)def->body.cfunc.argc, num, reg_cfp->sp + 1);
+#if CFUNC_FRAME_USAGE_CHECK
+ {
+ if (th->cfunc_usage_memo) {
+ struct cfunc_usage_record *record;
+ int found = 0;
+
+ /* fprintf(stderr, "> %s\n", th->cfunc_usage_memo); */
+ if (st_lookup(th->cfunc_usage_table, (st_data_t)th->cfunc_usage_memo, (st_data_t *)&record)) {
+ found = 1;
+ }
+ else {
+ record = malloc(sizeof(struct cfunc_usage_record));
+ record->shallow = 0;
+ record->deep = 0;
+ }
+
+ record->shallow++;
+
+ st_insert(th->cfunc_usage_table, (st_data_t)th->cfunc_usage_memo, (st_data_t)record);
+
+ if (found) {
+ free(th->cfunc_usage_memo);
+ }
+ th->cfunc_usage_memo = 0;
+ }
+ }
+#endif
if (reg_cfp != th->cfp + 1) {
rb_bug("cfp consistency error - send");
}