Revision: 7269
Author:   deton.kih
Date:     Thu Aug 18 04:16:49 2011
Log:      * Replace large alist to hash-table for performance.
* scm/tutcode.scm
  - (tutcode-reverse-rule-hash-table):
    Rename from tutcode-reverse-rule-alist.
  - (tutcode-reverse-kigou-rule-hash-table):
    Rename from tutcode-reverse-kigou-rule-alist.
  - (tutcode-reverse-bushudic-hash-table):
    Rename from tutcode-reverse-bushudic-alist.
  - (tutcode-bushu-decompose):
    Change to use hash-table instead of alist.
  - (tutcode-rule->reverse-hash-table): New.
    Extracted from tutcode-bushu-decompose and tutcode-reverse-find-seq.
  - (tutcode-reverse-find-seq):
    Change to use hash-table instead of alist.

http://code.google.com/p/uim/source/detail?r=7269

Modified:
 /trunk/scm/tutcode.scm

=======================================
--- /trunk/scm/tutcode.scm      Fri Aug 12 01:52:05 2011
+++ /trunk/scm/tutcode.scm      Thu Aug 18 04:16:49 2011
@@ -272,7 +272,7 @@
 ;;;  * ¼«Æ°¥Ø¥ë¥×ɽ¼¨µ¡Ç½¤òÄɲá£
 ;;;  * Êä´°/ͽ¬ÆþÎÏ¡¦½Ï¸ì¥¬¥¤¥Éµ¡Ç½¤òÄɲá£

-(require-extension (srfi 1 2 8))
+(require-extension (srfi 1 2 8 69))
 (require "generic.scm")
 (require "generic-predict.scm")
 (require-custom "tutcode-custom.scm")
@@ -314,15 +314,15 @@
 (define tutcode-rule ())
 ;;; 2¥¹¥È¥í¡¼¥¯µ­¹æÆþÎϥ⡼¥ÉÍÑ¥³¡¼¥Éɽ
 (define tutcode-kigou-rule ())
-;;; tutcode-rule¤«¤éºîÀ®¤¹¤ë¡¢µÕ°ú¤­¸¡º÷(´Á»ú¤«¤éÂǸ°¥ê¥¹¥È¤ò¼èÆÀ)ÍÑalist¡£
+;;; tutcode-rule¤«¤éºîÀ®¤¹¤ë¡¢µÕ°ú¤­¸¡º÷(´Á»ú¤«¤éÂǸ°¥ê¥¹¥È¤ò¼èÆÀ)ÍÑhash-table
 ;;; (¼«Æ°¥Ø¥ë¥×ÍѤÎÉô¼ó¹çÀ®ÊÑ´¹¸õÊ両º÷»þ¤Î¹â®²½¤Î¤¿¤á)
-(define tutcode-reverse-rule-alist ())
-;;; tutcode-kigou-rule¤«¤éºîÀ®¤¹¤ë¡¢µÕ°ú¤­¸¡º÷ÍÑalist¡£
-(define tutcode-reverse-kigou-rule-alist ())
+(define tutcode-reverse-rule-hash-table ())
+;;; tutcode-kigou-rule¤«¤éºîÀ®¤¹¤ë¡¢µÕ°ú¤­¸¡º÷ÍÑhash-table¡£
+(define tutcode-reverse-kigou-rule-hash-table ())
 ;;; tutcode-bushudic¤«¤éºîÀ®¤¹¤ë¡¢
-;;; µÕ°ú¤­¸¡º÷(¹çÀ®¸å¤Îʸ»ú¤«¤é¹çÀ®ÍѤÎ2ʸ»ú¤ò¼èÆÀ)ÍÑalist¡£
-;;; (¼«Æ°¥Ø¥ë¥×ÍѤÎÉô¼ó¹çÀ®ÊÑ´¹¸õÊ両º÷»þ¤Î¹â®²½¤Î¤¿¤á)
-(define tutcode-reverse-bushudic-alist ())
+;;; µÕ°ú¤­¸¡º÷(¹çÀ®¸å¤Îʸ»ú¤«¤é¹çÀ®ÍѤÎ2ʸ»ú¤ò¼èÆÀ)ÍÑhash-table¡£
+;;; (¼«Æ°¥Ø¥ë¥×ÍѤÎÉô¼ó¹çÀ®ÊÑ´¹¸õÊ両º÷»þ¤Î¹â®²½ÍÑ¡£¤¿¤À¤·½é²óºîÀ®»þ¤¬ÃÙ¤¤)
+(define tutcode-reverse-bushudic-hash-table ())
 ;;; stroke-help¤Ç¡¢²¿¤â¥­¡¼ÆþÎϤ¬Ìµ¤¤¾ì¹ç¤Ëɽ¼¨¤¹¤ëÆâÍÆ¤Îalist¡£
 ;;; (Ëè²ótutcode-rule¤òÁ´¤Æ¤Ê¤á¤ÆºîÀ®¤¹¤ë¤ÈÃÙ¤¤¤·¡¢
 ;;; ºÇ½é¤Î¥Ú¡¼¥¸¤Ï¸ÇÄêÆâÍÆ¤Ê¤Î¤Ç¡¢°ìÅÙºîÀ®¤·¤¿¤â¤Î¤ò»È¤¤²ó¤¹)
@@ -4014,15 +4014,23 @@
 ;;; @param c ʬ²òÂоݤÎʸ»ú
 ;;; @return ʬ²ò¤·¤Æ¤Ç¤­¤¿2¤Ä¤ÎÉô¼ó¤Î¥ê¥¹¥È¡£Ê¬²ò¤Ç¤­¤Ê¤«¤Ã¤¿¤È¤­¤Ï#f
 (define (tutcode-bushu-decompose c)
-  (if (null? tutcode-reverse-bushudic-alist)
-    (set! tutcode-reverse-bushudic-alist
-      (map
-        (lambda (elem)
-          (cons (caadr elem) (caar elem)))
-        tutcode-bushudic)))
-  (let ((res (assoc c tutcode-reverse-bushudic-alist)))
-    (and res
-      (cdr res))))
+  (if (null? tutcode-reverse-bushudic-hash-table)
+    (set! tutcode-reverse-bushudic-hash-table
+      (tutcode-rule->reverse-hash-table tutcode-bushudic)))
+  (hash-table-ref/default tutcode-reverse-bushudic-hash-table c #f))
+
+;;; tutcode-rule·Á¼°¤Î¥ê¥¹¥È¤«¤é¡¢µÕ°ú¤­¸¡º÷(´Á»ú¤«¤éÂǸ°¥ê¥¹¥È¤ò¼èÆÀ)ÍѤÎ
+;;; hash-table¤òºî¤ë
+;;; @param rule tutcode-rule·Á¼°¤Î¥ê¥¹¥È
+;;; @return hash-table
+(define (tutcode-rule->reverse-hash-table rule)
+  (alist->hash-table
+    (filter-map
+      (lambda (elem)
+        (and (string? (caadr elem)) ; 'tutcode-mazegaki-startÅù¤Ï½ü¤¯
+          (cons (caadr elem) (caar elem))))
+      rule)
+    string=?))

;;; ¼«Æ°¥Ø¥ë¥×:bushu.help¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤ÆÂоÝʸ»ú¤Î¥Ø¥ë¥×(2¤Ä¤ÎÉô¼ó)¤ò¼èÆÀ¤¹¤ë
 ;;; @param c ÂоÝʸ»ú
@@ -4315,28 +4323,21 @@
 ;;; @param rule tutcode-rule
 ;;; @return ÆþÎÏ¥­¡¼¤Î¥ê¥¹¥È¡£tutcode-ruleÃæ¤Ëc¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f
 (define (tutcode-reverse-find-seq c rule)
-  (let*
-    ((make-reverse-rule-alist
-      (lambda (r)
-        (map
-          (lambda (elem)
-            (cons (caadr elem) (caar elem)))
-          r)))
-     (alist
-      (if (eq? rule tutcode-kigou-rule)
-        (begin
-          (if (null? tutcode-reverse-kigou-rule-alist)
-            (set! tutcode-reverse-kigou-rule-alist
-              (make-reverse-rule-alist rule)))
-          tutcode-reverse-kigou-rule-alist)
-        (begin
-          (if (null? tutcode-reverse-rule-alist)
-            (set! tutcode-reverse-rule-alist
-              (make-reverse-rule-alist rule)))
-          tutcode-reverse-rule-alist)))
-     (res (assoc c alist)))
-    (and res
-      (cdr res))))
+  (and (string? c)
+    (let*
+      ((hash-table
+        (if (eq? rule tutcode-kigou-rule)
+          (begin
+            (if (null? tutcode-reverse-kigou-rule-hash-table)
+              (set! tutcode-reverse-kigou-rule-hash-table
+                (tutcode-rule->reverse-hash-table rule)))
+            tutcode-reverse-kigou-rule-hash-table)
+          (begin
+            (if (null? tutcode-reverse-rule-hash-table)
+              (set! tutcode-reverse-rule-hash-table
+                (tutcode-rule->reverse-hash-table rule)))
+            tutcode-reverse-rule-hash-table))))
+       (hash-table-ref/default hash-table c #f))))

 ;;; ¸½ºß¤Îstate¤¬preedit¤ò»ý¤Ä¤«¤É¤¦¤«¤òÊÖ¤¹¡£
 ;;; @param pc ¥³¥ó¥Æ¥­¥¹¥È¥ê¥¹¥È

Reply via email to