Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

分享【汉字拼音码表】 另求优化‘拼音读取缓存函数’!

litao  发表于:2013-09-07 07:12:00  
复制

拼音码表是在一个软件包中找到的,很好用、准确性很高,并有汉字完整拼音、简繁体、全角字母数字。具有实用价值!

比论坛中的靠汉字编码来转换字母,可靠性高很多。


但是,读取速度很慢,我写了一个缓存函数,但效果没有太理想(从18秒减到11秒)。请高手优化一下!拼音码转换


 

Top
litao 发表于:2013-09-07 08:17:53

更新了代码! 提示命中率!新转换代码

加大缓存,命中率提高到70% 时间缩短了一大半!!



access代码: pychar

Private Function pychar(字 As String) As String
    pychar = ""
    Dim rs As Recordset, fd As Field
    
    SQL = "SELECT DISTINCT 拼音码.拼音 FROM 拼音码 WHERE (((拼音码.简体)='" & 字 & "') OR((拼音码.繁体)= '" & 字 & "'));"
    Debug.Print SQL
    
    Set rs = db.OpenRecordset(SQL) '表名|查询名|SQL语句
    
    If rs.EOF And rs.BOF Then Exit Function '没有记录退出
    
    Set fd = rs.Fields("拼音")

    pychar = Left(fd.Value, 1) '首字符
End Function




litao 发表于:2013-09-07 11:10:04

请老师看看,能否再优化一下,缓存函数! 谢谢!


Private Const 缓存长度 = 50

Private Static Function py缓存(字 As String) As String
    py缓存 = ""
    If 字 = "" Then Exit Function   
    Dim sz(1 To 2, 0 To 缓存长度) As String, i As Integer
    For i = 1 To 缓存长度
        If sz(1, i) = 字 Then
            命中数 = 命中数 + 1
            GoTo 命中
        End If
        'If sz(1, i) = "" Then GoTo 无命中
    Next i   
无命中:
    i = 缓存长度        '无命中 视同 末尾命中 处理
    sz(1, i) = 字
    sz(2, i) = pychar(字) '读表
命中:
    py缓存 = sz(2, i)

If i = 1 Then Exit Function '第一个命中,不改变数组
    sz(1, 0) = sz(1, i) '倒腾数据 “sz(1, 0)” 作为中转位置
    sz(2, 0) = sz(2, i)   
    For i = i To 1 Step -1 '重排缓存
         sz(1, i) = sz(1, i - 1)
         sz(2, i) = sz(2, i - 1)
    Next i
End Function



litao 发表于:2013-09-07 19:25:19


自行优化了一下(改成了long数组),最终运行时间只要4.6秒   代码


Private Static Function py缓存(字 As String) As String '
    py缓存 = ""
    If 字 = "" Then Exit Function
    
    Dim sz(1 To 2, 0 To 缓存长度) As Long, bm As Long, i As Integer, 尾 As Integer
    For i = 1 To 尾
        If sz(1, i) = Asc(字) Then
            命中数 = 命中数 + 1
            GoTo 命中
        End If
    Next i
    
无命中:
    尾 = 尾 + 1
    If 尾 > 缓存长度 Then 尾 = 缓存长度 '限制长度
    sz(1, 0) = Asc(字)
    py缓存 = pychar(字)  '读表

    If py缓存 = "" Then  '空字符用0 代表   

        bm = 0

    Else
        bm = Asc(py缓存)
    End If
    sz(2, 0) = bm
    i = 尾        '无命中 视同 末尾命中 处理
    GoTo 重排
    
命中:
    bm = sz(2, i)
    If bm = 0 Then
        py缓存 = "" '空字符用0 代表
    Else
        py缓存 = Chr(bm)
    End If
    If i = 1 Then Exit Function '第一个命中,不改变数组
    sz(1, 0) = sz(1, i) '倒腾数据 “sz(1, 0)” 作为中转位置
    sz(2, 0) = sz(2, i)
    
重排:
    For i = i To 1 Step -1 '重排缓存
         sz(1, i) = sz(1, i - 1)
         sz(2, i) = sz(2, i - 1)
    Next i
End Function

litao 发表于:2018-04-19 07:08:17
消灭零回复!

总记录:4篇  页次:1/1 9 1 :