yahns Ruby server user/dev discussion
 help / color / mirror / code / Atom feed
* [PATCH] save around 1500 bytes of memory on x86-64
@ 2014-11-18  8:20 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2014-11-18  8:20 UTC (permalink / raw)
  To: yahns-public; +Cc: Eric Wong

Replacing a Regexp argument to a rarely-called String#split with a
literal String can save some memory.  Each removed Regexp memsize is
469 bytes on Ruby 2.1, and Ruby does not currently deduplicate
literal Regexps.

On Ruby 2.1, the "objspace" extension shows:

	ObjectSpace.memsize_of(/,/) => 469

Is slightly smaller at 453 bytes on 2.2.0dev (r48474), and
these numbers do not include the 40-byte object overhead.

Nevertheless, this is a waste for non-performance-critical code
during the startup phase.  Identical literal strings are
automatically deduplicated by Ruby 2.1, and has no additional
overhead because Rack (and likely some real apps) also includes
several instances of the literal "," byte.

We'll drop the unnecessary "encoding: binary" magic comment
in yahns/server.rb as well, as that file includes no literal
binary strings.

The downside of using a literal string argument in these cases is
a 40-byte object gets allocated on every call, but the affected
pieces of code are only called once in a process lifetime.
 lib/yahns/rackup_handler.rb | 4 ++--
 lib/yahns/server.rb         | 3 +--
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/lib/yahns/rackup_handler.rb b/lib/yahns/rackup_handler.rb
index 943d858..127db48 100644
--- a/lib/yahns/rackup_handler.rb
+++ b/lib/yahns/rackup_handler.rb
@@ -18,8 +18,8 @@ module Yahns::RackupHandler # :nodoc:
       app(:rack, app) do
         addr = o[:listen] || "#{o[:Host]||default_host}:#{o[:Port]||8080}"
         # allow listening to multiple addresses
-        if addr =~ /,/
-          addr.split(/,/).each { |l| listen(l) }
+        if addr.include?(',')
+          addr.split(',').each { |l| listen(l) }
           listen addr
diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb
index ae2ebd4..b28e741 100644
--- a/lib/yahns/server.rb
+++ b/lib/yahns/server.rb
@@ -1,4 +1,3 @@
-# -*- encoding: binary -*-
 # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
 # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
 require_relative 'queue_quitter'
@@ -314,7 +313,7 @@ class Yahns::Server # :nodoc:
     # because that can completely break the non-blocking one.
     # Unfortunately, there is no one-off MSG_DONTWAIT-like flag for
     # accept4(2).
-    inherited = ENV['YAHNS_FD'].to_s.split(/,/).map do |fd|
+    inherited = ENV['YAHNS_FD'].to_s.split(',').map do |fd|
       io = Socket.for_fd(fd.to_i)
       set_server_sockopt(io, sock_opts(io))
       @logger.info "inherited addr=#{sock_name(io)} fd=#{fd}"

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2014-11-18  8:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-18  8:20 [PATCH] save around 1500 bytes of memory on x86-64 Eric Wong

Code repositories for project(s) associated with this public inbox


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).