This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/main by this push:
     new e9b91c550 Optimize revid parsing: 50-90% faster
e9b91c550 is described below

commit e9b91c5502a7e276e9f486e125fe91533685c9ac
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Tue Oct 14 14:31:04 2025 -0400

    Optimize revid parsing: 50-90% faster
    
    Latest Erlang has `binary:decode_hex/1` which seems to be faster [1] than 
doing a
    convertion to bigint and then building a binary from that.
    
    [1] https://gist.github.com/nickva/d43b7ffd9997cd251f4573e2be25abec
    
    Erlang 26, Intel(R) Xeon(R) Gold 6248 CPU @ 2.50GHz, Debian 11
    
    ```
    > bench_parse_revid:go().
    * N: 10
    * b2i + <<_:128>>  : 30
    * decode_hex       : 3 (faster pct:90)
    * l2i + <<_:128>>  : 8
    * l2b + decode_hex : 4 (faster pct:50)
    ************
    
    * N: 100
    * b2i + <<_:128>>  : 54
    * decode_hex       : 30 (faster pct:44)
    * l2i + <<_:128>>  : 76
    * l2b + decode_hex : 45 (faster pct:41)
    ************
    
    * N: 500
    * b2i + <<_:128>>  : 294
    * decode_hex       : 159 (faster pct:46)
    * l2i + <<_:128>>  : 411
    * l2b + decode_hex : 238 (faster pct:42)
    ************
    
    * N: 1000
    * b2i + <<_:128>>  : 582
    * decode_hex       : 316 (faster pct:46)
    * l2i + <<_:128>>  : 820
    * l2b + decode_hex : 465 (faster pct:43)
    ************
    
    * N: 2500
    * b2i + <<_:128>>  : 1472
    * decode_hex       : 874 (faster pct:41)
    * l2i + <<_:128>>  : 2154
    * l2b + decode_hex : 1224 (faster pct:43)
    ************
    ```
---
 src/couch/src/couch_doc.erl | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl
index 3a677ad40..7ad0f76b6 100644
--- a/src/couch/src/couch_doc.erl
+++ b/src/couch/src/couch_doc.erl
@@ -189,11 +189,9 @@ from_json_obj(_Other, _) ->
     throw({bad_request, "Document must be a JSON object"}).
 
 parse_revid(RevId) when is_binary(RevId), size(RevId) =:= 32 ->
-    RevInt = binary_to_integer(RevId, 16),
-    <<RevInt:128>>;
+    binary:decode_hex(RevId);
 parse_revid(RevId) when is_list(RevId), length(RevId) =:= 32 ->
-    RevInt = list_to_integer(RevId, 16),
-    <<RevInt:128>>;
+    binary:decode_hex(list_to_binary(RevId));
 parse_revid(RevId) when is_binary(RevId) ->
     RevId;
 parse_revid(RevId) when is_list(RevId) ->

Reply via email to