ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:99530] [Ruby master Feature#17111] Improve performance of Net::HTTPHeader#set_form by 40%
@ 2020-08-10  4:09 tonytonyjan
  2020-08-10  5:36 ` [ruby-core:99532] " mame
  0 siblings, 1 reply; 2+ messages in thread
From: tonytonyjan @ 2020-08-10  4:09 UTC (permalink / raw)
  To: ruby-core

Issue #17111 has been reported by tonytonyjan (Wei-Hang Jian).

----------------------------------------
Feature #17111: Improve performance of Net::HTTPHeader#set_form by 40%
https://bugs.ruby-lang.org/issues/17111

* Author: tonytonyjan (Wei-Hang Jian)
* Status: Open
* Priority: Normal
----------------------------------------
## diff

```diff
diff --git a/lib/net/http/header.rb b/lib/net/http/header.rb
index a8901e7..3f1a008 100644
--- a/lib/net/http/header.rb
+++ b/lib/net/http/header.rb
@@ -475,9 +475,8 @@ def set_form(params, enctype='application/x-www-form-urlencoded', formopt={})
     @body = nil
     @body_stream = nil
     @form_option = formopt
-    case enctype
-    when /\Aapplication\/x-www-form-urlencoded\z/i,
-      /\Amultipart\/form-data\z/i
+    case enctype.downcase
+    when 'application/x-www-form-urlencoded', 'multipart/form-data'
       self.content_type = enctype
     else
       raise ArgumentError, "invalid enctype: #{enctype}"
```

## benchmark

```ruby
require 'benchmark'
require 'net/http'

module Net::HTTPHeader
  def set_form2(params, enctype = 'application/x-www-form-urlencoded', formopt = {})
    @body_data = params
    @body = nil
    @body_stream = nil
    @form_option = formopt
    case enctype.downcase
    when 'application/x-www-form-urlencoded', 'multipart/form-data'
      self.content_type = enctype
    else
      raise ArgumentError, "invalid enctype: #{enctype}"
    end
  end
end

n = 500_000
request = Net::HTTP::Post.new('/')
Benchmark.bm do |x|
  GC.disable
  x.report { n.times { request.set_form [] } }
  x.report { n.times { request.set_form2 [] } }
end
```

```
       user     system      total        real
   0.777054   0.101768   0.878822 (  0.880472)
   0.539860   0.088957   0.628817 (  0.630178)
```

I don't see any test for `#set_form` in `test/net/http/test_httpheader.rb`, let me know if I need to add more tests, thanks!

---Files--------------------------------
patch-1.diff (621 Bytes)


-- 
https://bugs.ruby-lang.org/

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [ruby-core:99532] [Ruby master Feature#17111] Improve performance of Net::HTTPHeader#set_form by 40%
  2020-08-10  4:09 [ruby-core:99530] [Ruby master Feature#17111] Improve performance of Net::HTTPHeader#set_form by 40% tonytonyjan
@ 2020-08-10  5:36 ` mame
  0 siblings, 0 replies; 2+ messages in thread
From: mame @ 2020-08-10  5:36 UTC (permalink / raw)
  To: ruby-core

Issue #17111 has been updated by mame (Yusuke Endoh).

Assignee set to naruse (Yui NARUSE)
Status changed from Open to Assigned

----------------------------------------
Feature #17111: Improve performance of Net::HTTPHeader#set_form by 40%
https://bugs.ruby-lang.org/issues/17111#change-86992

* Author: tonytonyjan (Wei-Hang Jian)
* Status: Assigned
* Priority: Normal
* Assignee: naruse (Yui NARUSE)
----------------------------------------
## diff

```diff
diff --git a/lib/net/http/header.rb b/lib/net/http/header.rb
index a8901e7..3f1a008 100644
--- a/lib/net/http/header.rb
+++ b/lib/net/http/header.rb
@@ -475,9 +475,8 @@ def set_form(params, enctype='application/x-www-form-urlencoded', formopt={})
     @body = nil
     @body_stream = nil
     @form_option = formopt
-    case enctype
-    when /\Aapplication\/x-www-form-urlencoded\z/i,
-      /\Amultipart\/form-data\z/i
+    case enctype.downcase
+    when 'application/x-www-form-urlencoded', 'multipart/form-data'
       self.content_type = enctype
     else
       raise ArgumentError, "invalid enctype: #{enctype}"
```

## benchmark

```ruby
require 'benchmark'
require 'net/http'

module Net::HTTPHeader
  def set_form2(params, enctype = 'application/x-www-form-urlencoded', formopt = {})
    @body_data = params
    @body = nil
    @body_stream = nil
    @form_option = formopt
    case enctype.downcase
    when 'application/x-www-form-urlencoded', 'multipart/form-data'
      self.content_type = enctype
    else
      raise ArgumentError, "invalid enctype: #{enctype}"
    end
  end
end

n = 500_000
request = Net::HTTP::Post.new('/')
Benchmark.bm do |x|
  GC.disable
  x.report { n.times { request.set_form [] } }
  x.report { n.times { request.set_form2 [] } }
end
```

```
       user     system      total        real
   0.777054   0.101768   0.878822 (  0.880472)
   0.539860   0.088957   0.628817 (  0.630178)
```

I don't see any test for `#set_form` in `test/net/http/test_httpheader.rb`, let me know if I need to add more tests, thanks!

---Files--------------------------------
patch-1.diff (621 Bytes)


-- 
https://bugs.ruby-lang.org/

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-08-10  5:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-10  4:09 [ruby-core:99530] [Ruby master Feature#17111] Improve performance of Net::HTTPHeader#set_form by 40% tonytonyjan
2020-08-10  5:36 ` [ruby-core:99532] " mame

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 read-only IMAP folder(s) and NNTP newsgroup(s).