[前][次][番号順一覧][スレッド一覧]

ruby-changes:70318

From: Samuel <ko1@a...>
Date: Sun, 19 Dec 2021 08:25:58 +0900 (JST)
Subject: [ruby-changes:70318] f3e30b26c5 (master): Default size for IO::Buffer.

https://git.ruby-lang.org/ruby.git/commit/?id=f3e30b26c5

From f3e30b26c509c6dd707bc07c4a73fbac2576e9e2 Mon Sep 17 00:00:00 2001
From: Samuel Williams <samuel.williams@o...>
Date: Sun, 19 Dec 2021 09:56:52 +1300
Subject: Default size for IO::Buffer.

---
 include/ruby/io/buffer.h    |  1 +
 io_buffer.c                 | 42 ++++++++++++++++++++++++++++++++++++++----
 test/ruby/test_io_buffer.rb |  4 ++++
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/include/ruby/io/buffer.h b/include/ruby/io/buffer.h
index 9c0eaefcc53..70dc9a5df88 100644
--- a/include/ruby/io/buffer.h
+++ b/include/ruby/io/buffer.h
@@ -23,6 +23,7 @@ RBIMPL_SYMBOL_EXPORT_BEGIN() https://github.com/ruby/ruby/blob/trunk/include/ruby/io/buffer.h#L23
 
 RUBY_EXTERN VALUE rb_cIOBuffer;
 RUBY_EXTERN size_t RUBY_IO_BUFFER_PAGE_SIZE;
+RUBY_EXTERN size_t RUBY_IO_BUFFER_DEFAULT_SIZE;
 
 enum rb_io_buffer_flags {
     // The memory in the buffer is owned by someone else.
diff --git a/io_buffer.c b/io_buffer.c
index 67806ff5cff..bb296f48ec1 100644
--- a/io_buffer.c
+++ b/io_buffer.c
@@ -15,6 +15,7 @@ https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L15
 
 VALUE rb_cIOBuffer;
 size_t RUBY_IO_BUFFER_PAGE_SIZE;
+size_t RUBY_IO_BUFFER_DEFAULT_SIZE;
 
 #ifdef _WIN32
 #else
@@ -347,14 +348,20 @@ io_buffer_map(int argc, VALUE *argv, VALUE klass) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L348
 VALUE
 rb_io_buffer_initialize(int argc, VALUE *argv, VALUE self)
 {
-    if (argc < 1 || argc > 2) {
-        rb_error_arity(argc, 1, 2);
+    if (argc < 0 || argc > 2) {
+        rb_error_arity(argc, 0, 2);
     }
 
     struct rb_io_buffer *data = NULL;
     TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data);
 
-    size_t size = RB_NUM2SIZE(argv[0]);
+    size_t size;
+
+    if (argc > 0) {
+        size = RB_NUM2SIZE(argv[0]);
+    } else {
+        size = RUBY_IO_BUFFER_DEFAULT_SIZE;
+    }
 
     enum rb_io_buffer_flags flags = 0;
     if (argc >= 2) {
@@ -1068,6 +1075,30 @@ io_buffer_clear(int argc, VALUE *argv, VALUE self) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L1075
     return self;
 }
 
+static
+size_t io_buffer_default_size(size_t page_size) {
+    // Platform agnostic default size, based on emperical performance observation:
+    const size_t platform_agnostic_default_size = 64*1024;
+
+    // Allow user to specify custom default buffer size:
+    const char *default_size = getenv("RUBY_IO_BUFFER_DEFAULT_SIZE");
+    if (default_size) {
+        // For the purpose of setting a default size, 2^31 is an acceptable maximum:
+        int value = atoi(default_size);
+
+        // assuming sizeof(int) <= sizeof(size_t)
+        if (value > 0) {
+            return value;
+        }
+    }
+
+    if (platform_agnostic_default_size < page_size) {
+        return page_size;
+    }
+
+    return platform_agnostic_default_size;
+}
+
 void
 Init_IO_Buffer(void)
 {
@@ -1084,8 +1115,11 @@ Init_IO_Buffer(void) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L1115
     RUBY_IO_BUFFER_PAGE_SIZE = sysconf(_SC_PAGESIZE);
 #endif
 
-    // Efficient sicing of mapped buffers:
+    RUBY_IO_BUFFER_DEFAULT_SIZE = io_buffer_default_size(RUBY_IO_BUFFER_PAGE_SIZE);
+
+    // Efficient sizing of mapped buffers:
     rb_define_const(rb_cIOBuffer, "PAGE_SIZE", SIZET2NUM(RUBY_IO_BUFFER_PAGE_SIZE));
+    rb_define_const(rb_cIOBuffer, "DEFAULT_SIZE", SIZET2NUM(RUBY_IO_BUFFER_DEFAULT_SIZE));
 
     rb_define_singleton_method(rb_cIOBuffer, "map", io_buffer_map, -1);
 
diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb
index f7c175b589c..c629d2829ee 100644
--- a/test/ruby/test_io_buffer.rb
+++ b/test/ruby/test_io_buffer.rb
@@ -9,6 +9,10 @@ class TestIOBuffer < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_io_buffer.rb#L9
     Warning[:experimental] = experimental
   end
 
+  def test_default_size
+    assert_equal IO::Buffer::DEFAULT_SIZE, IO::Buffer.new.size
+  end
+
   def assert_negative(value)
     assert(value < 0, "Expected #{value} to be negative!")
   end
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]