tagCANDY CGI VBレスキュー(花ちゃん) - 文字列連結の高速化(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
文字列連結の高速化(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

文字列連結の高速化(VB6.0) [No.88の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/27 12:43
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード]                            *
* キーワード:ファイル入出力,,,,,                                            *
***********************************************************************************

文字列連結の高速化 - まんたろー  2004/06/10-19:11 No.9220

暇な方

文字列連結の高速化の競争しましょう。
以下のコードの高速化をしてみてください。
Private Function func()
    Dim i As Long
    Dim tmp As string
    For i = 0 To 100000
        tmp = tmp & CStr(i)
    Next i
    func = tmp
End Function

計測は以下の方法で
Private Sub Command1_Click()
    Dim tm As Double
    Dim data As String
    tm = Timer
    data = func
    MsgBox Timer - tm
End Sub

ハードの性能に依存するので、高速化前/後の倍率で勝負です。

私の記録です。

前:108.26秒
後:0.22秒
約492倍

環境:Win2000
     VB6

方法は後ほど書きます。
それでは皆さんがんばりましょう

メンテ

Page: 1 |

文字列連結の高速化(VB6.0)_1  (No.1の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:17
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード]                            *
* キーワード:ファイル入出力,,,,,                                            *
***********************************************************************************

----------------------------------------------------------------------
Re: 文字列連結の高速化 - とうきちろう  2004/06/10-19:33 No.9221
----------------------------------------------------------------------

前:113.77秒
後:3.30秒
約34.48倍

環境:Win2000
VB6

Const MAX_VALUE = 100000
Const END_OF_LOOP = (MAX_VALUE / 5&) - 1&

Const ADD_VALUE = 55555
Const INITIAL_VALUE = 12345&

Private Sub Command1_Click()
    Dim tm As Long
    Dim data As String
    
    tm = Timer
    
    data = func
    
    MsgBox Timer - tm
End Sub

Private Function func()
    Dim i As Long

    Dim sCurrStr As String
    Dim lCurrVal As Long

    Dim lLoop As Long

    lCurrVal = INITIAL_VALUE

    For lLoop = 1 To END_OF_LOOP
       sCurrStr = sCurrStr & CStr(lCurrVal)
       lCurrVal = lCurrVal + ADD_VALUE
    Next

    func = sCurrStr
End Function


メンテ
文字列連結の高速化(VB6.0)_2  (No.2の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:17
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード]                            *
* キーワード:ファイル入出力,,,,,                                            *
***********************************************************************************

--------------------------------------------------------------------------
Re^2: 文字列連結の高速化 - 魔界の仮面弁士  2004/06/11-00:08 No.9227
--------------------------------------------------------------------------

> 方法を問わないなら

結果が常に一定の文字列なので、結果の代入だけなら 0.08秒でした。(^^;)


ま、それは反則として。
ループで作成するなら、結果を一時ファイルに吐いて、
それを一括してGet#→StrConvする手法で 0.36秒でした。

また、常套手段なJoin法、Midステートメント法は、それぞれ0.52秒、0.28秒でした。

# 高速化前コードの実行時間は内緒。(謎

メンテ
文字列連結の高速化(VB6.0)_3  (No.3の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:18
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード]                            *
* キーワード:ファイル入出力,,,,,                                            *
***********************************************************************************

---------------------------------------------------------------------------
Re: 文字列連結の高速化 - 花ちゃん  2004/06/11-00:16 No.9228
---------------------------------------------------------------------------

Join 法 0.15 秒 Mid 法 0.11 秒  元々 150 秒




---------------------------------------------------------------------------
Re: 文字列連結の高速化 - まんたろー  2004/06/11-09:27 No.9231
---------------------------------------------------------------------------

やっぱり、みんな考えることは同じですね。
私はJoinでやりました。

メンテ
文字列連結の高速化(VB6.0)_4  (No.4の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:18
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード]                            *
* キーワード:ファイル入出力,,,,,                                            *
***********************************************************************************

----------------------------------------------------------------------------
Re^2: 文字列連結の高速化 - Say  2004/06/11-20:38 No.9268
----------------------------------------------------------------------------

> 何かすごい方法とか無いんですかね?
「常套手段」というやつは、それなりに試した結果
常套手段になっているわけですから・・・。

すごくはないけど、VBにしてはちょっとひねたやり方をひとつ・・・
Cならポインタ使って、もうちょっとましな書き方ができますが。

(あんまり吟味してないんで、バグってるかも。
再帰にすればコードは簡単になりますが、処理は遅くなるでしょう。)

Private Function func()
Dim i1 As Long
Dim i2 As Long
Dim i3 As Long
Dim i4 As Long
Dim i5 As Long
Dim i6 As Long
Dim j As Long
Dim tmp(100000 * 6& * 4) As Byte
For i1 = 0& To 9&
    tmp(i1 * 2&) = 48 + i1
Next
For i1 = 1& To 9&
    For i2 = 0& To 9
        j = (i1 * 10& + i2) * 4& - 20&
        tmp(j) = 48& + i1
        tmp(j + 2&) = 48& + i2
    Next
Next
For i1 = 1& To 9&
    For i2 = 0& To 9&
        For i3 = 0& To 9&
            j = (i1 * 100& + i2 * 10& + i3) * 6& - 220&
            tmp(j) = 48& + i1
            tmp(j + 2&) = 48& + i2
            tmp(j + 4&) = 48& + i3
        Next
    Next
Next
For i1 = 1& To 9&
    For i2 = 0& To 9&
        For i3 = 0& To 9&
            For i4 = 0& To 9&
                j = (i1 * 1000& + i2 * 100& + i3 * 10& + i4) * 8& - 2220&
                tmp(j) = 48& + i1
                tmp(j + 2&) = 48& + i2
                tmp(j + 4&) = 48& + i3
                tmp(j + 6&) = 48& + i4
            Next
        Next
    Next
Next
For i1 = 1& To 9&
    For i2 = 0& To 9&
        For i3 = 0& To 9&
            For i4 = 0& To 9&
                For i5 = 0& To 9&
                    j = (i1 * 10000& + i2 * 1000& + i3 * 100& + _
                                       i4 * 10& + i5) * 10& - 22220&
                    tmp(j) = 48& + i1
                    tmp(j + 2&) = 48& + i2
                    tmp(j + 4&) = 48& + i3
                    tmp(j + 6&) = 48& + i4
                    tmp(j + 8&) = 48& + i5
                Next
            Next
        Next
    Next
Next
j = j + 10&
tmp(j) = 49
tmp(j + 2&) = 48
tmp(j + 4&) = 48
tmp(j + 6&) = 48
tmp(j + 8&) = 48
tmp(j + 10&) = 48
func = tmp()
End Function
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ