|
|
سطر 1: |
سطر 1: |
| <noinclude>{{DISPLAYTITLE: منشئ ملفات تعريف جمع البيانات المهملة (GC::Profiler) في روبي}}</noinclude>يوفر مُنشئ ملفات تعريف جمع البيانات المهملة <code>GC::Profiler</code> الوصول إلى معلومات عن تشغيلات GC بما في ذلك الوقت والطول وحجم مساحة الكائن. | | <noinclude>{{DISPLAYTITLE:الوحدة <code>GC::Profiler</code> في روبي}}</noinclude>يوفر مُنشئ ملفات تعريف جمع البيانات المهملة <code>GC::Profiler</code> الوصول إلى معلومات عن تشغيلات <code>[[Ruby/GC|GC]]</code> بما في ذلك الوقت والطول وحجم مساحة الكائن. اطلع مثلًا على المثال التالي:<syntaxhighlight lang="ruby"> |
| | |
| أمثلة:<syntaxhighlight lang="ruby">
| |
| GC::Profiler.enable | | GC::Profiler.enable |
| require 'rdoc/rdoc' | | require 'rdoc/rdoc' |
| GC::Profiler.report | | GC::Profiler.report |
| GC::Profiler.disable | | GC::Profiler.disable |
| </syntaxhighlight>انظر أيضًا <code>GC.count</code> و <code>GC.malloc_allocated_size</code> و <code>GC.malloc_allocations</code>. | | </syntaxhighlight>اطلع أيضًا على صفحات التوابع <code>[[Ruby/GC/count|GC.count]]</code> و <code>[[Ruby/GC/malloc allocated size|GC.malloc_allocated_size]]</code> و <code>[[Ruby/GC/malloc allocations|GC.malloc_allocations]]</code>. |
| | |
| === توابع الصنف العام ===
| |
| | |
| ==== <code>GC::Profiler.clear → nil</code> ====
| |
| مسح بيانات مُنشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>.
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| gc_profile_clear(void)
| |
| {
| |
| rb_objspace_t *objspace = &rb_objspace;
| |
| if (GC_PROFILE_RECORD_DEFAULT_SIZE * 2 < objspace->profile.size) {
| |
| objspace->profile.size = GC_PROFILE_RECORD_DEFAULT_SIZE * 2;
| |
| objspace->profile.records = realloc(objspace->profile.records, sizeof(gc_profile_record) * objspace->profile.size);
| |
| if (!objspace->profile.records) {
| |
| rb_memerror();
| |
| }
| |
| }
| |
| MEMZERO(objspace->profile.records, gc_profile_record, objspace->profile.size);
| |
| objspace->profile.next_index = 0;
| |
| objspace->profile.current_record = 0;
| |
| return Qnil;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| | |
| ==== <code>GC::Profiler.disable → nil</code> ====
| |
| إيقاف مُنشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>.
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| gc_profile_disable(void)
| |
| {
| |
| rb_objspace_t *objspace = &rb_objspace;
| |
| | |
| objspace->profile.run = FALSE;
| |
| objspace->profile.current_record = 0;
| |
| return Qnil;
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| ==== <code>GC::Profiler.enable → nil</code> ====
| |
| بدء منشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>.
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| gc_profile_enable(void)
| |
| {
| |
| rb_objspace_t *objspace = &rb_objspace;
| |
| objspace->profile.run = TRUE;
| |
| objspace->profile.current_record = 0;
| |
| return Qnil;
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| ==== <code>GC::Profiler.enabled? → true or false</code> ====
| |
| الحالة الحالية لوضع مُنشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>.
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| gc_profile_enable_get(VALUE self)
| |
| {
| |
| rb_objspace_t *objspace = &rb_objspace;
| |
| return objspace->profile.run ? Qtrue : Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| | |
| ==== <code>GC::Profiler.raw_data → [Hash, ...]</code> ====
| |
| إعادة مصفوفة <code>[[Ruby/Array|Array]]</code> من تجزئات بيانات ملفات التعريف الأولية الفردية مُرتَّبة من الأقدم إلى الأحدث بواسطة :<code>GC_INVOKE_TIME</code>.
| |
| | |
| فعلى سبيل المثال:<syntaxhighlight lang="ruby">
| |
| [
| |
| {
| |
| :GC_TIME=>1.3000000000000858e-05,
| |
| :GC_INVOKE_TIME=>0.010634999999999999,
| |
| :HEAP_USE_SIZE=>289640,
| |
| :HEAP_TOTAL_SIZE=>588960,
| |
| :HEAP_TOTAL_OBJECTS=>14724,
| |
| :GC_IS_MARKED=>false
| |
| },
| |
| # ...
| |
| ]
| |
| </syntaxhighlight>وتعني المفاتيح:
| |
| | |
| ===== <code>:GC_TIME</code> =====
| |
| الوقت المنقضي <code>[[Ruby/Time|Time]]</code> بالثواني لتشغيل <code>[[Ruby/GC|GC]]</code> هذا.
| |
| | |
| ===== <code>:GC_INVOKE_TIME</code> =====
| |
| الوقت المنقضي <code>[[Ruby/Time|Time]]</code> بالثواني من بدء التشغيل وحتى استدعاء <code>[[Ruby/GC|GC]]</code>.
| |
| | |
| ===== <code>:HEAP_USE_SIZE</code> =====
| |
| إجمالي ذاكرة التكدس المستخدمة بوحدة البايت.
| |
| | |
| ===== <code>:HEAP_TOTAL_SIZE</code> =====
| |
| إجمالي ذاكرة التكدس بوحدة البايت.
| |
| | |
| ===== <code>:HEAP_TOTAL_OBJECTS</code> =====
| |
| إجمالي عدد الكائنات.
| |
| | |
| ===== <code>:GC_IS_MARKED</code> =====
| |
| إعادة <code>true</code> إذا كان GC في مرحلة التحديد.
| |
| | |
| إذا بُنيَ روبي مع <code>GC_PROFILE_MORE_DETAIL</code>، سيكون من الممكن أيضا الوصول إلى مفاتيح التجزئة التالية:<syntaxhighlight lang="ruby">
| |
| :GC_MARK_TIME
| |
| :GC_SWEEP_TIME
| |
| :ALLOCATE_INCREASE
| |
| :ALLOCATE_LIMIT
| |
| :HEAP_USE_PAGES
| |
| :HEAP_LIVE_OBJECTS
| |
| :HEAP_FREE_OBJECTS
| |
| :HAVE_FINALIZE
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| gc_profile_record_get(void)
| |
| {
| |
| VALUE prof;
| |
| VALUE gc_profile = rb_ary_new();
| |
| size_t i;
| |
| rb_objspace_t *objspace = (&rb_objspace);
| |
| | |
| if (!objspace->profile.run) {
| |
| return Qnil;
| |
| }
| |
| | |
| for (i =0; i < objspace->profile.next_index; i++) {
| |
| gc_profile_record *record = &objspace->profile.records[i];
| |
| | |
| prof = rb_hash_new();
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("GC_FLAGS")), gc_info_decode(0, rb_hash_new(), record->flags));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("GC_TIME")), DBL2NUM(record->gc_time));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("GC_INVOKE_TIME")), DBL2NUM(record->gc_invoke_time));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_USE_SIZE")), SIZET2NUM(record->heap_use_size));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_TOTAL_SIZE")), SIZET2NUM(record->heap_total_size));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_TOTAL_OBJECTS")), SIZET2NUM(record->heap_total_objects));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("GC_IS_MARKED")), Qtrue);
| |
| #if GC_PROFILE_MORE_DETAIL
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("GC_MARK_TIME")), DBL2NUM(record->gc_mark_time));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("GC_SWEEP_TIME")), DBL2NUM(record->gc_sweep_time));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("ALLOCATE_INCREASE")), SIZET2NUM(record->allocate_increase));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("ALLOCATE_LIMIT")), SIZET2NUM(record->allocate_limit));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_USE_PAGES")), SIZET2NUM(record->heap_use_pages));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_LIVE_OBJECTS")), SIZET2NUM(record->heap_live_objects));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_FREE_OBJECTS")), SIZET2NUM(record->heap_free_objects));
| |
| | |
| rb_hash_aset(prof, ID2SYM(rb_intern("REMOVING_OBJECTS")), SIZET2NUM(record->removing_objects));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("EMPTY_OBJECTS")), SIZET2NUM(record->empty_objects));
| |
| | |
| rb_hash_aset(prof, ID2SYM(rb_intern("HAVE_FINALIZE")), (record->flags & GPR_FLAG_HAVE_FINALIZE) ? Qtrue : Qfalse);
| |
| #endif
| |
| | |
| #if RGENGC_PROFILE > 0
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("OLD_OBJECTS")), SIZET2NUM(record->old_objects));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("REMEMBERED_NORMAL_OBJECTS")), SIZET2NUM(record->remembered_normal_objects));
| |
| rb_hash_aset(prof, ID2SYM(rb_intern("REMEMBERED_SHADY_OBJECTS")), SIZET2NUM(record->remembered_shady_objects));
| |
| #endif
| |
| rb_ary_push(gc_profile, prof);
| |
| }
| |
| | |
| return gc_profile;
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| ==== <code>GC::Profiler.report</code> ====
| |
| | |
| ==== <code>GC::Profiler.report(io)</code> ====
| |
| كتابة <code>::result</code> إلى <code>$stdout</code> أو كائن <code>IO</code> المُعطي.
| |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | == توابع الصنف العام == |
|
| | ===<code>[[Ruby/GC::Profiler/clear|clear]]</code>=== |
| static VALUE
| | يمسح بيانات مُنشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>. |
| gc_profile_report(int argc, VALUE *argv, VALUE self)
| |
| {
| |
| VALUE out;
| |
|
| |
|
| if (argc == 0) {
| | ===<code>[[Ruby/GC::Profiler/disable|disable]]</code>=== |
| out = rb_stdout;
| | يوقف مُنشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>. |
| }
| |
| else {
| |
| rb_scan_args(argc, argv, "01", &out);
| |
| }
| |
| gc_profile_dump_on(out, rb_io_write);
| |
|
| |
|
| return Qnil;
| | ===<code>[[Ruby/GC::Profiler/enable|enable]]</code>=== |
| }
| | يبدأ منشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>. |
|
| |
| </syntaxhighlight> | |
|
| |
|
| ==== <code>GC::Profiler.result → String</code> ====
| | ===<code>[[Ruby/GC::Profiler/enabled-3F|enabled?]]</code>=== |
| إعادة تقرير بيانات ملف التعريف مثل:<syntaxhighlight lang="ruby">
| | يتحقق من الحالة الحالية لوضع مُنشئ ملفات تعريف <code>[[Ruby/GC|GC]]</code>. |
| GC 1 invokes. | |
| Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC time(ms)
| |
| 1 0.012 159240 212940 10647 0.00000000000001530000
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
| static VALUE
| |
| gc_profile_result(void)
| |
| {
| |
| VALUE str = rb_str_buf_new(0);
| |
| gc_profile_dump_on(str, rb_str_buf_append);
| |
| return str;
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
|
| ==== <code>GC::Profiler.total_time → float</code> ====
| | ===<code>[[Ruby/GC::Profiler/raw_data|raw_data]]</code>=== |
| إجمالي الوقت المستخدم لتجميع البيانات المهملة بالثواني.
| | يعيد مصفوفة من <nowiki/>[[Ruby/Hash|الأنواع Hash]] تحوي بيانات ملفات التعريف الأولية الفردية مُرتَّبة من الأقدم إلى الأحدث بواسطة <code>:GC_INVOKE_TIME</code>. |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/GC::Profiler/report|report]]</code>=== |
|
| | يكتب الناتج <code>::result</code> على المجرى <code>$stdout</code> أو كائن من النوع <code>[[Ruby/IO|IO]]</code>. |
| static VALUE
| |
| gc_profile_total_time(VALUE self)
| |
| {
| |
| double time = 0;
| |
| rb_objspace_t *objspace = &rb_objspace;
| |
|
| |
|
| if (objspace->profile.run && objspace->profile.next_index > 0) {
| | ===<code>[[Ruby/GC::Profiler/result|result]]</code>=== |
| size_t i;
| | يعيد تقرير بيانات ملف التعريف. |
| size_t count = objspace->profile.next_index;
| |
|
| |
|
| for (i = 0; i < count; i++) {
| | ===<code>[[Ruby/GC::Profiler/total_time|total_time]]</code>=== |
| time += objspace->profile.records[i].gc_time;
| | يعيد إجمالي الوقت المستخدم لتجميع البيانات المهملة بالثواني. |
| }
| |
| }
| |
| return DBL2NUM(time);
| |
| }
| |
|
| |
| </syntaxhighlight> | |
|
| |
|
| = مصادر = | | == مصادر == |
| * [http://ruby-doc.org/core-2.5.1/GC/Profiler.html صفحة GC::Profiler في توثيق روبي الرسمي]. | | * [http://ruby-doc.org/core-2.5.1/GC/Profiler.html صفحة الوحدة GC::Profiler في توثيق روبي الرسمي]. |
| [[تصنيف:Ruby]] | | [[تصنيف:Ruby]] |
| [[تصنيف:Ruby Methods]] | | [[تصنيف:Ruby Module]] |
| | [[تصنيف:Ruby GC::Profiler]] |
يوفر مُنشئ ملفات تعريف جمع البيانات المهملة GC::Profiler
الوصول إلى معلومات عن تشغيلات GC
بما في ذلك الوقت والطول وحجم مساحة الكائن. اطلع مثلًا على المثال التالي:
GC::Profiler.enable
require 'rdoc/rdoc'
GC::Profiler.report
GC::Profiler.disable
اطلع أيضًا على صفحات التوابع GC.count
و GC.malloc_allocated_size
و GC.malloc_allocations
.
توابع الصنف العام
يمسح بيانات مُنشئ ملفات تعريف GC
.
يوقف مُنشئ ملفات تعريف GC
.
يبدأ منشئ ملفات تعريف GC
.
يتحقق من الحالة الحالية لوضع مُنشئ ملفات تعريف GC
.
يعيد مصفوفة من الأنواع Hash تحوي بيانات ملفات التعريف الأولية الفردية مُرتَّبة من الأقدم إلى الأحدث بواسطة :GC_INVOKE_TIME
.
يكتب الناتج ::result
على المجرى $stdout
أو كائن من النوع IO
.
يعيد تقرير بيانات ملف التعريف.
يعيد إجمالي الوقت المستخدم لتجميع البيانات المهملة بالثواني.
مصادر