5

Avoid unnecessary double string split in ActiveSupport::MessageVerifier#verified...

 2 years ago
source link: https://github.com/rails/rails/pull/42919
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Copy link

Member

p8 commented on Aug 31

@jcmfernandes I was looking at a sample message and the digest is always at the end.
It would be nice if we could search from the end of the message instead of going through all the data first.

require 'benchmark/ips'
signed_message = "BAhJIgIAEDQ4UEFlbFZFTmJGcUVJZWJNWnQ3azdwVGp6N0lpdkNTTzdob1kxcDBvZlltbWJYUks2bGVUNnMza2V4U0hRVEVpNkYwclhiWmZnb2k5NTkzVEdqeFFSdlQ2RkE1bmg0RlN0cGgxYzFIM3hOaHRwUXlvcDJHdGZQY3lycHlWa1ZodVI1VkZTUmpvTUN6TEZTcGxaVjV4OEloVzk0OUZMa1lqbm5Oc1gybFNQekJIeEVrOUpnQjUzZHFqRnhhM1FKMENYVUlkQ3Q5NDJ2bFpDNkE5T05ITnAxNTU2YTFjSVpDRjdyU2NpZ21JTmVMV0M5Y1c4Y3hWOXVWQVZZU254b3plYVlTSUt3SEVBVUtROFNVdUVvdXZaM0NuVm1tdWIwQ1MwNnJwQXBwS2FQSmE5Nm5Db0Jhb3dodmR0QW5ucG82cDdNbEJtRzZ6MG5JWEVTV1ZkaFhGRGl2MG1QaFNZR3JsR055clVzNThxelJUbUFPZ21VaTM1TTBDaG82QUxzY0ViQjAxaEZ5WTVzc2pyd3Z6TVlLb3k3ak1jNGVvV1dLZGYwM2tRQjdyZHpLanRqUnRaYzZYTUVVRGRrNUpuWG1kZlI4cEw5NzY5MnkyTFVnQVdFQkJrWTMwTEYyMlFROVhTVGhXU0MxVzkwWWd4OTBVWm5aTEFDMkZ0SjBQc0ZxWFQ5Tk8zOGhmZGZaM3p0bXVBNm5seUNhYkdOTlZFTnFwbmVYMDNFT0UyaEZJUEJZdnFFaDRMSVl5Nk94YlZBajRNd2dIRGZ0WGluaGRudFpyWUFLaXpOQ0ZqcTc5aU1nTTdqcTNWV1ZGcm1VQWdON1dkdnZjVG0wanY5ZWU5bzAydmhkbDVHZURuTDI2VzcyQ1lnc3R6NGl4RDhYV3RRMUxCcXdsMFg4QzlpMkRKUGdYY0VSUkZ6QkhFNDFQRm1NY1ozb0V0bTM2bm8wMkQwSmlWM3UxWnVMaWlLRmVybjFIMmRSeHQ2dzkxM01HVlVaRTVhZDlUb3JuSUpTQUVHb2NQV2R2SWxGcUxMeEE1UGNBSTVJT25yemRhSU1ZRDdxQTNUMVJIenl0RFJxdFlvZTF0QVpXSjM5UTNIUENOdlZOcElPd1lBaHdudWFRd2JKVU5RN3JENmRyUkVpdzdWbEJwSFk4NjhQdzN0d2l6bVdsZnVIT0R3SThhQkxtdUliTjBLOEl4SGM4dUJPTTFjWXkwdFh1QjAwRm5uUmJaVm1tUlpjS2xrQkpCU1poYkVhWGFvZ3cxQVVZalppTVM0TXNMdUNlV2JWN2J5RVFCNWJuQzhlcGJiOEdVaUVPTFdnUTJUSUl6czZ4eEpXZWR0U3NMZk9IbTlzcmhXSGxkeWlNUms5ZWVPZTNyUmhIMDZyc0l0VUtSNW9oRXowTlJVcTExTXg0cDluTmtjMXNxZk9IVWVBcVBCOWVpVnZNdWhudTB1RXYydENramo0Wm5YVnd2V2Y1TmNoR3lWaFdkRzdseEhHaTUzVWxnSGY1M2V3bmliQnRCU00yWHlJaG9YYmQ2Y1F1eGJFOUhaWVJFbHFmUFZBSzJmTG5kY3JsVU5XTVdNNGp1czc3dnZVb0ZtNVNkUkJyVVlmSFN1MkNpb0F0Um50UDNKamxmZDVnUWZER21TS202d21PSEM0S2d4RUh5TXhTdmlNTVZFR1J1UEpPbUFDZ2kyTVYxbms1d3doM3NyR0k5MG5ZdUZ4VUJVdTFPNWxQSUJtYXYyY0EyTXpvOEVLWjVseWlscjNnRlZKbW9ZTDFvZml4Y1ZMQUNxcUFpQkxmaTd4Tk1HQmZSSTlMdDA0TDFOYVpwVHJ4MHlpOWczaE00Q2JuMmlYeUlNMTBJZ1h1YkxlUVJTYlpDeHhnTDZUWGd1bERGOVcya21oMjRlWEl0UmRPWkxXRWNadTBuWkg1T3pWTTBZd25sdEpERldNTG9jWjF3QTJNOFJkSzlmdHpiMTdXWmhnM2RYSkM0QU1rRzBpeXc1bVdjUWVweko0V2hpRnNlVng3QnJJd1ZqZFZTSDRYU1V6R0lnMDZuN2NtVmJ2Z0tDaHhDYlNnZ3JGMHc1blI1Y1hkajNQVVdreFRPYlFsOFBTcFR1S1pIZWp5NVBNVW9zWWdZbVpZaVg2N0VXQk9VbElQNWJhNnB6Vm02UWt3MWNPbzQxUjIxcHFoZ3RWRlU3T3NLekd6YU5lQzFCRnVNYWFONWNNZ01LcnNTUUY1Mm5rUTRUR2dFN0FENTBScXdsS255UHJBVjVBdGwyNEJaV3JWaWFIbTEwSTNPQW1xaE56cXlCelozTHlNb1pvNkZwRjlxUEZSa09zbldGNzFQVUQ5ZGdQQWd3T3FnT2tzaUN2VG0wVUhMenBnUnVVcXZCZW10MjRKTlB5QVhnS0FZV3h6R3ZydXVyemc2cEZhZDI3dWthYWIzckVVUHhxdzdqTU5YSHRWZ05lSnR4cGNMVDB6dTBuTFdGNkROalhXeVNZUEV6Q1YyZ3NXQkRzRHpvellHN3NDUXdtTnB4dExRd21XM3RsQ09MMmZZMVQzU0dQcUZqSzkxMXZOUERhRE5xb3NxTzUzZDlvMVA4ZHJPV3J4WVYzaGxlSWowTUxGbUQ1d0kyQkxJMmxBeHRnMlRWV0hCT1FESGF3allDbDJvRjN3Q05seXZzekltZjk4R3VNMFcyd1p6YWdhQ1NQWE1NSVZSeURWMGpaeHEwam5PR2E0OXhnQTdUM1lHWnBxSlg2ajJlWThhVFVTVFp0TDRzNkJiRUU4ZmxGYUJDQ1hnQ0dIdmdwR1RKSWdXRTVKUGlkc0IwdER2WjgxemF3RFVNUXVLR3NZRFVKNjNta0c2NjlNZEcwZUxxT0lKODU2UkNQeG43VGxyTjBPN0RyM3J3ZVJTSFJOZlc3eVhYbTlLSEZUWjJQSEllaGtOUGNtRTBydFc0MXdXMWRZblRWMnYzZnNtVVZLWFFlckhOY0YxdVJvNFhQdExxeU5iN2JTSXZKa0tpQ2JraEFCY2V1ajlYb1hjZkFzOUVmOWJ4WURYSko4bU1vOFJvdEFZNE9sZ1Q5dmVpVW4xZzNZUUMyUnhtT0NQQkVGd2ZsN2pqTmg5ZDNwNzBCTnk2d1NoeERMM2pwZmhNdVE2VkQ4bE1XdVlKVXNlczdYNFlXN1drTFI5VXpzVmFmV0w3V0d4SWNneWRXU3M0MjlxeDlpMGhVcWRGb2RwNDA5ODFxc0h2YUo3eHhRVW5LQ0M1N05tdlJjeERwdmN0OFhxUTZkMFE3b1F6dGY3VEJaOEd2VldxV2VpWkFDRWliWUZ0ZWljYnB3Y29xcm9VRjdvVnIxcVVuaEwycUFtQVlsZEtzVVBQWHpNN0MxYmtjTTJ0QzVhMlJPdzRrR090Zk5TU09ERE0zaU5EdnE2Y3N2TzB3WTdOcDhqcHJUaDRDekFEM3hhTFM3UkNmVkx6bFEzc1d6NUt3Qko5ZGxRQnZqZVp3MXFDc2F0UnhpZDl2aXY3b0g2U2JoaEpJdVFLaGhleG80bHc1TlI4TmRhc0Z3RXBiTkl6NEZRcE9uS2dnYWNzNDQxbmEyNm9oTXd5SHBZd0JHY09KMEtDYkNMZ0UzTnZwZWxoVFRGRXpPUG5heVV6SmdtcHEybFZsWmV1d1d4dXB4MENHUWRxdjVsNXVVcGxuMHNmelNBaEQxWW9qcFRaRGZtVmFwanNMMm1NM2dyQjZ4Nmh2VUl5c0c1Mk5pRkowT2hLa2lIYlVldE5CU2lieEd5dDN3Q1N6bEhpdnVSQjFOa0lmVmgxT2x6SWh4cGZXdGlZNEdwUHlkdEFQcFZid2NLQUh6WTZxSEdlaWVnamFkaTJweVY4bDBFcWxLM3JVNDVIa3VhWnNjcnhCNjUwUTlJQzNQWnRKOEtRd3pqQk50d1piYlcwcHc2RENQeHpURXJlOEVZNzQ2OXZXSHJtTXlwN0d3S0VxdDJ4bWZTQXNjV0I5TzlaaXBhWk05ZmVNaUtFdjZmdlhwUlFGbVdPcGgycVFaNXhEMjlQRUZHU3daREtGNUJlbVhvUzF2SGVWZE9iSU1EbldIUk1RY1VkRWZLa3RMOUpRVkk3WXRlUUhnTENrNTU1MThET2tYY0FaNUpFS0w0aEc4eWlGQWZGdWljeHZuaE45ZnZHZXhwbENzY1ZmTGdSS0pTMlZ3c203MHpsT1BZSXowN0FUNDJuRGdBQzZkZ2ZnbHBlTnE2bHI1Wm1lTnpjMTE2UzB4RXFhMHFTcmljdW1HVFIwTVpzWWV1emFyTEV2OFpsS3QzUzhEQmdSNG40QlJNWHZVbkpyT2Y2aUJZMmVFcTRoTEFYTDVVQjVCVFpQYzRNdWVISmRMWjBSNEFqU0NLUmxWamJnbjdaVUZKcTRwRUtjZVlCNWpUTmZPU2Q2OUxlZjdERVZnSzlOUjZqelJ4ZHRmdU10cmFsYlFYbTVKeUhUbzh5VmFkWHM2V2lRZUxaR0pUenhiM2ZJdm5SbWgybnN5cHkwc0I4Z0dMeVNNQVQ4R2xxc3BVbjZ4R1N2bHlPV0JNajBJV0hCaTRZd2NpaWZ0eXhyN0syamVpMEdxb1RURlRwYTRLNVhBQ3dhd0JwSzYwZXViek95SkR4TFFTT090MXA3UnJWWnJISFozSVZuU1Ywc1N2Uk1rU0lBNmNwNzhLcFFnNzVQM3NKWnZucmhWamphRjNqWFE2aDB5cWVoZVE3dWJlWGhmQmdFVHNsbHRaRFg2bXZwTkJKUUUwREthSWJ6QmFLaFlJQnBncXBhd1p0cnJRUGY4YVZwa0RIODU3VU8zZXpWanVBVE0zVDNRcTJqZ1BZNW1GSHlwUGlpTzJSc2ZYQU9FQndZRW94RHpwM1o2NkZQMEEzYzhRaDZ4VnVOdkdxQXdQSFI1YlhWY3ZHUndoYXRieTRydXNzSmUwNDc3SDZKVVY0UW9WeHBPQUxmQTdVT3BSN3FDQUdDcXpUSXRFUDhleVNFZWRpcVhyeUh1OGo0N2UwUUJkTzI4MFBQM2J5aXdiSmRmcXY3bmRFNFRIQk5QNjBXbTBlY0ZUbVI0M21Gcm8yMVM1emV2b0ZJWm5mQURNRzNVcHdZemFoYUFMdFFsQmUwQUV5Z21xeE9XQllDNWUxRjNUUXNPb1ZKbW9SWERxVlVzaWxrZGFaMW9pTVdhNFVTNTlZdnBIREpSZ1RXSEFKbDNVVjZWYlZrc0FDWnc2YXFCeEdPUkxEdW8wMDBlbkI4aGlXMHBKMlZESHlCNzJPOVVSWmFscktUZFVRb0pBT2EyQlQ0SU9HWnVoSFRNbmN1NzREbWpHUFFGcWJNYU9Da1RDc3JMZmZMVWxyS3dWZDBTVXVTU1lJZ3J5enlUVkdCc2lDWkRObmE3Um5QUlVQSTJ5QU9sYU54b3JHbnlWeTJLeDhFQkVDZDVmbjJ6bnBwWmxJYlB6RTczbUF5Y3J4b1VnamIGOgZFRg==--60ae7b3ca695673426771dfb5e817d43718f3b92"

GC.start

Benchmark.ips do |x|
  x.time = 10
  x.warmup = 2

  x.report('split') do
    signed_message.split('==', 2)
  end

  x.report('reverse split') do
    signed_message.reverse.split('==', 2).map(&:reverse)
  end

  x.report('split with regexp') do
    signed_message.split(/(.+)--([^-]+)$/)
  end

  x.report('rindex') do
    index = signed_message.rindex("==")
    signed_message[0, index]
    signed_message[index+2, signed_message.length]
  end

  x.report('rindex with ranges') do
    index = signed_message.rindex("==")
    signed_message[0...index]
    signed_message[index+2..-1]
  end

  x.compare!
end
Warming up --------------------------------------
               split    30.599k i/100ms
       reverse split    20.604k i/100ms
   split with regexp     3.620k i/100ms
              rindex    61.198k i/100ms
  rindex with ranges    49.064k i/100ms
Calculating -------------------------------------
               split    304.998k (± 5.9%) i/s -      3.060M in  10.069927s
       reverse split    232.232k (±13.2%) i/s -      2.287M in  10.061747s
   split with regexp     25.875k (±17.6%) i/s -    249.780k in  10.081676s
              rindex    380.131k (±20.4%) i/s -      3.672M in  10.135841s
  rindex with ranges    375.177k (±19.1%) i/s -      3.631M in  10.120255s

Comparison:
              rindex:   380131.4 i/s
  rindex with ranges:   375177.3 i/s - same-ish: difference falls within error
               split:   304998.4 i/s - same-ish: difference falls within error
       reverse split:   232231.5 i/s - 1.64x  (± 0.00) slower
   split with regexp:    25874.9 i/s - 14.69x  (± 0.00) slower

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK