From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dmitry Gutov Newsgroups: gmane.emacs.bugs Subject: bug#20154: 25.0.50; json-encode-string is too slow for large strings Date: Sat, 21 Mar 2015 23:09:57 +0200 Message-ID: <550DDE25.1090000@yandex.ru> References: <86twxf68zk.fsf@yandex.ru> <83384zwxdx.fsf@gnu.org> <550C3218.4000903@yandex.ru> <831tkjww0y.fsf@gnu.org> <550C3AB9.7020403@yandex.ru> <83wq2bveq6.fsf@gnu.org> <550C491A.6000909@yandex.ru> <83siczvcss.fsf@gnu.org> <550C504A.10708@yandex.ru> <83r3sjva0q.fsf@gnu.org> <550C6A06.6040203@yandex.ru> <83fv8zv0b1.fsf@gnu.org> <550C9E7B.4060907@yandex.ru> <837fuavkn9.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1426972288 4351 80.91.229.3 (21 Mar 2015 21:11:28 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 21 Mar 2015 21:11:28 +0000 (UTC) Cc: 20154@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Mar 21 22:11:17 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YZQfn-0001vB-HF for geb-bug-gnu-emacs@m.gmane.org; Sat, 21 Mar 2015 22:11:11 +0100 Original-Received: from localhost ([::1]:49001 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZQfm-0007h5-N7 for geb-bug-gnu-emacs@m.gmane.org; Sat, 21 Mar 2015 17:11:10 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZQfh-0007go-Kk for bug-gnu-emacs@gnu.org; Sat, 21 Mar 2015 17:11:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YZQfe-0004M9-E0 for bug-gnu-emacs@gnu.org; Sat, 21 Mar 2015 17:11:05 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:42094) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZQfe-0004Lx-Ar for bug-gnu-emacs@gnu.org; Sat, 21 Mar 2015 17:11:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YZQfd-0000SE-JN for bug-gnu-emacs@gnu.org; Sat, 21 Mar 2015 17:11:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Dmitry Gutov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 21 Mar 2015 21:11:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 20154 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 20154-submit@debbugs.gnu.org id=B20154.14269722091670 (code B ref 20154); Sat, 21 Mar 2015 21:11:01 +0000 Original-Received: (at 20154) by debbugs.gnu.org; 21 Mar 2015 21:10:09 +0000 Original-Received: from localhost ([127.0.0.1]:60103 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YZQem-0000Qs-LI for submit@debbugs.gnu.org; Sat, 21 Mar 2015 17:10:08 -0400 Original-Received: from mail-wg0-f46.google.com ([74.125.82.46]:35107) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YZQek-0000PU-JT for 20154@debbugs.gnu.org; Sat, 21 Mar 2015 17:10:07 -0400 Original-Received: by wgdm6 with SMTP id m6so116111661wgd.2 for <20154@debbugs.gnu.org>; Sat, 21 Mar 2015 14:10:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=/QtLjDS3MLezyOkzusuoq7MqQ0pDEb5rDr5OEUJZj5Q=; b=cH3YxLqn0O7GMwlqlxFZNjaXdyCgsAamhpLN4JsHdHJ+Vud1hGwTaP+GHAstwMvP/Y g2Hkb3zWTs3R/V/2vHXr6bhzFanNeEWIihEgngrzZg2VOVYsGkCGtANZuFY0YRXLoQz0 6UfIkZFtZoqxN8Cy7ETxKF7fGp2wnsnt+kFfSXuamoXH2vqwbHOIR+tcw0v/8hj9cjnV FXENHPxCPNddUPKJCCQ4KmOQwybP8h5aTcUw5j9AQ8bQ1brZmrkdTAxLAR0RSo5o586B XStIRiSwZEcHhStikUSIFT+5naGFfpDPwqMNEw27aE9YAn2/3+oal/91xzYJS83rlZht ig6g== X-Received: by 10.180.189.35 with SMTP id gf3mr6909909wic.5.1426972201122; Sat, 21 Mar 2015 14:10:01 -0700 (PDT) Original-Received: from [192.168.1.3] ([82.102.93.54]) by mx.google.com with ESMTPSA id nb4sm12151830wjc.20.2015.03.21.14.09.59 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 21 Mar 2015 14:10:00 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:36.0) Gecko/20100101 Thunderbird/36.0 In-Reply-To: <837fuavkn9.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:100762 Archived-At: On 03/21/2015 10:07 AM, Eli Zaretskii wrote: > Do you really need 'format' here? Why not > > (concat "\\" (char-to-string (char-after (match-beginning 0)))) > > instead? > > Or even simply insert these two parts at the match point, after > deleting the match. Yes, thanks. It gave a small improvement, by 5ms or so. Here's the updated definition (by the way, `json-special-chars' is still needed, to convert ?\n to ?n, and so on, and the performance hit is negligible). (defun json-encode-string-1 (string) "Return a JSON representation of STRING." (with-temp-buffer (insert string) (goto-char (point-min)) ;; Skip over ASCIIish printable characters. (while (re-search-forward "\\([\"\\/\b\f\n\r\t]\\)\\|[^ -~]" nil t) (let ((c (char-before))) (delete-region (1- (point)) (point)) (if (match-beginning 1) ;; Special JSON character (\n, \r, etc.). (insert "\\" (car (rassoc c json-special-chars))) ;; Fallback: UCS code point in \uNNNN form. (insert (format "\\u%04x" c))))) (concat "\"" (buffer-string) "\""))) Futher, it seems I didn't measure its performance well enough to begin with. The average time out of 10 runs comes down to 85ms. Compare it to 150ms, from this implementation: (defun json-encode-string-2 (string) "Return a JSON representation of STRING." (concat "\"" (replace-regexp-in-string "\\([\"\\/\b\f\n\r\t]\\)\\|[^ -~]" (lambda (s) (if (match-beginning 1) (format "\\%c" (car (rassoc (string-to-char s) json-special-chars))) (format "\\u%04x" (string-to-char s)))) string t t) "\""))