浏览代码

org-odt.el: Fix performance issue on manifest file writing

* contrib/lisp/org-odt.el (org-odt-write-manifest-file): Don't
use write-region.

The org-odt-write-manifest-file function take too much time -
several seconds for 164 files. This patch provides a cheaper
implementation (hundredths of a seconds for 164 files).

Original patch by Jérémy Compostella
<jeremy.compostella@gmail.com>.  Rewritten by Jambunathan K to
minimize the actual number of lines changed.

TINYCHANGE.

From http://www.mail-archive.com/emacs-orgmode@gnu.org/msg49248.html
I'm currently generating a road book for a trip from different
Org-Mode file and other data. It results in a 13 thousands
lines Org-Mode file and I have some performance issues. Using
the ELP package, I isolated the two main bottlenecks.

One is in org-odt : the org-odt-write-manifest-file function
is called once and takes 5.546672 seconds to write a 167 lines
file. I rewrote this function and now it takes 0.01606 seconds
to write the same file.
Jambunathan K 13 年之前
父节点
当前提交
2ded8ccb85
共有 1 个文件被更改,包括 16 次插入15 次删除
  1. 16 15
      contrib/lisp/org-odt.el

+ 16 - 15
contrib/lisp/org-odt.el

@@ -1959,21 +1959,22 @@ visually."
 (defun org-odt-write-manifest-file ()
   (make-directory "META-INF")
   (let ((manifest-file (expand-file-name "META-INF/manifest.xml")))
-    (write-region
-     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
-     <manifest:manifest xmlns:manifest=\"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0\" manifest:version=\"1.2\">\n"
-     nil manifest-file)
-    (mapc
-     (lambda (file-entry)
-       (let* ((version (nth 2 file-entry))
-	      (extra (if version
-			 (format  " manifest:version=\"%s\"" version)
-		       "")))
-	 (write-region
-	  (format org-odt-manifest-file-entry-tag
-		  (nth 0 file-entry) (nth 1 file-entry) extra)
-	  nil manifest-file t))) org-odt-manifest-file-entries)
-    (write-region "\n</manifest:manifest>" nil manifest-file t)))
+    (with-current-buffer
+	(find-file-noselect manifest-file t)
+      (insert
+       "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+     <manifest:manifest xmlns:manifest=\"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0\" manifest:version=\"1.2\">\n")
+      (mapc
+       (lambda (file-entry)
+	 (let* ((version (nth 2 file-entry))
+		(extra (if version
+			   (format  " manifest:version=\"%s\"" version)
+			 "")))
+	   (insert
+	    (format org-odt-manifest-file-entry-tag
+		    (nth 0 file-entry) (nth 1 file-entry) extra))))
+       org-odt-manifest-file-entries)
+      (insert "\n</manifest:manifest>"))))
 
 (defun org-odt-update-meta-file (opt-plist)
   (let ((date (org-odt-iso-date-from-org-timestamp