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: Sun, 22 Mar 2015 16:52:03 +0200 Message-ID: <550ED713.2010201@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> <550DDE25.1090000@yandex.ru> 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 1427036009 27245 80.91.229.3 (22 Mar 2015 14:53:29 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 22 Mar 2015 14:53:29 +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 Sun Mar 22 15:53:15 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 1YZhFX-00079B-AJ for geb-bug-gnu-emacs@m.gmane.org; Sun, 22 Mar 2015 15:53:11 +0100 Original-Received: from localhost ([::1]:51311 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZhFV-00039O-Ca for geb-bug-gnu-emacs@m.gmane.org; Sun, 22 Mar 2015 10:53:09 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:48479) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZhFR-00039J-TC for bug-gnu-emacs@gnu.org; Sun, 22 Mar 2015 10:53:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YZhFO-0004gc-MU for bug-gnu-emacs@gnu.org; Sun, 22 Mar 2015 10:53:05 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:42747) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZhFO-0004gY-J4 for bug-gnu-emacs@gnu.org; Sun, 22 Mar 2015 10:53:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YZhFO-0001Ft-6r for bug-gnu-emacs@gnu.org; Sun, 22 Mar 2015 10:53:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Dmitry Gutov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 22 Mar 2015 14:53:02 +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.14270359344766 (code B ref 20154); Sun, 22 Mar 2015 14:53:02 +0000 Original-Received: (at 20154) by debbugs.gnu.org; 22 Mar 2015 14:52:14 +0000 Original-Received: from localhost ([127.0.0.1]:60756 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YZhEc-0001Eo-8J for submit@debbugs.gnu.org; Sun, 22 Mar 2015 10:52:14 -0400 Original-Received: from mail-wg0-f54.google.com ([74.125.82.54]:35884) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YZhEa-0001EZ-5N for 20154@debbugs.gnu.org; Sun, 22 Mar 2015 10:52:12 -0400 Original-Received: by wgra20 with SMTP id a20so126806149wgr.3 for <20154@debbugs.gnu.org>; Sun, 22 Mar 2015 07:52:06 -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=Hhq8a9JCba7HhKpR7XAneiyScVWWyKSUXJ6JiUL32Pw=; b=duRNrsDrGlzjPlGRzQlo9t/tYGqSyvRJ/iiy+AfdLB3eusTcgutpdhzsCXp3+iueE/ 3cg7l3qNw6rs6hwdVigIY9/umgSqTiPCe8dJxBpmpl6yQdP/eeX9vYXOLQfbQAhLb+Vc 9YbQ/5QDumff0KIc3LgqAMFr0EsK9b95HVU5lBi5JXVBYXNSQSYui35TO/P7wzwCH14j 8pXuVfe1FRYiOYvPBj8iv68mnBRuU8SLGWCZVYGsb2zSGvwRFpFNkBBDBtMwbtlAkaM/ /i4gxog3jb7C9La3OOhgxEzzfBTaj9CyA8Ag7H5Oq9ypRbFIX0L0ZpaYrc8Bv/dONNAU PyYA== X-Received: by 10.195.12.97 with SMTP id ep1mr180679163wjd.134.1427035926506; Sun, 22 Mar 2015 07:52:06 -0700 (PDT) Original-Received: from [192.168.1.3] ([82.102.93.54]) by mx.google.com with ESMTPSA id vh8sm15161755wjc.12.2015.03.22.07.52.05 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 22 Mar 2015 07:52:06 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:36.0) Gecko/20100101 Thunderbird/36.0 In-Reply-To: <550DDE25.1090000@yandex.ru> 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:100781 Archived-At: Here's the version I've arrived at: (defun json-encode-string-3 (string) "Return a JSON representation of STRING." ;; Reimplement the meat of `replace-regexp-in-string', for ;; performance (bug#20154). (let ((l (length string)) (start 0) (res (list "\""))) ;; Skip over ASCIIish printable characters. (while (string-match "[\"\\/\b\f\n\r\t]\\|[^ -~]" string start) (let* ((mb (match-beginning 0)) (c (aref string mb)) (special (rassoc c json-special-chars))) (push (substring string start mb) res) (push (if special ;; Special JSON character (\n, \r, etc.). (string ?\\ (car special)) ;; Fallback: UCS code point in \uNNNN form. (format "\\u%04x" c)) res) (setq start (1+ mb)))) (push (substring string start l) res) (push "\"" res) (apply #'concat (nreverse res)))) A bit slower than the temp-buffer version (90ms vs 80ms), but consistently faster than the current version, even on small strings. Probably the best we can do in Lisp. If no one has any better ideas, I'm going to install it.