英数字以外の削除の仕方(高速処理法)(VB6.0)_1 (No.1の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 13:16
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード] * * キーワード:高速化,検索,文字列の連結,置換え,配列処理, * ***********************************************************************************
----------------------------------------------------------------- Re: 英数字以外の削除の仕方 - 花ちゃん 2004/06/01-08:19 No.9107 -----------------------------------------------------------------
この場合の処理は文字列の連結に99.5%かかっており、比較の部分は0.5%しかかかって いません。 従って、文字列の連結をいかに早くするかにあります。 文字列が短い場合は連結も時間はかからないのですが、長くなると極端に遅くなります。 そこである程度までは、都度連結し、ある程度長くなったら連結をつなぎ変えます。 説明するより下記を試して見て下さい。 私のマシンでは、48.6 秒→ 1.1 と極端に早くなりました。 (あまりにも早いので間違っていないか心配ですが!。(^_^) )
Option Explicit Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Sub Command1_Click() Dim lngStartTime As Long Dim strOneLineDat As String Dim strTemp As String Dim strTemp1 As String Dim intLoop As Integer Dim intAsc As Integer Dim dat As String
Dim i As Integer strOneLineDat = "aAcd-0324-PあOI*POいL\AA" lngStartTime = timeGetTime strTemp = "" strTemp1 = "" For i = 1 To 10000 For intLoop = 1 To Len(strOneLineDat) dat = Mid$(strOneLineDat, intLoop, 1) intAsc = Asc(dat) If (intAsc >= 97 And intAsc <= 122) _ Or (intAsc >= 65 And intAsc <= 90) _ Or (intAsc >= 48 And intAsc <= 57) Then strTemp1 = strTemp1 & dat If Len(strTemp1) > 50 Then strTemp = strTemp & strTemp1 strTemp1 = "" End If End If Next intLoop Next i strOneLineDat = strTemp & strTemp1 Label1.Caption = "timeGetTime : " & (timeGetTime - lngStartTime) / 1000 End Sub
|
英数字以外の削除の仕方(高速処理法)(VB6.0)_2 (No.2の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 13:16
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード] * * キーワード:高速化,検索,文字列の連結,置換え,配列処理, * ***********************************************************************************
----------------------------------------------------------------- Re^2: 英数字以外の削除の仕方 - LESIA 2004/06/01-09:07 No.9109 ----------------------------------------------------------------- 文字列の連結は遅いので、置き換えるようにするともっと速くなります。 私のマシンでは花ちゃんの方法でも5秒くらい掛かりましたが、この方法だと0.5秒に なりました(^^)
Private Sub Command2_Click() Dim lngStartTime As Long Dim strOneLineDat As String Dim strTemp As String Dim intLoop As Integer Dim intAsc As Integer Dim dat As String Dim i As Integer Dim n As Integer strOneLineDat = "aAcd-0324-PあOI*POいL\AA" lngStartTime = timeGetTime strTemp = Space$(Len(strOneLineDat)) For i = 1 To 10000 n = 1 For intLoop = 1 To Len(strOneLineDat) dat = Mid$(strOneLineDat, intLoop, 1) intAsc = Asc(dat) If (intAsc >= 97 And intAsc <= 122) _ Or (intAsc >= 65 And intAsc <= 90) _ Or (intAsc >= 48 And intAsc <= 57) Then Mid$(strTemp, n, 1) = dat n = n + 1 End If Next intLoop Next i strOneLineDat = Left$(strTemp, n) Label2.Caption = "timeGetTime : " & (timeGetTime - lngStartTime) / 1000 End Sub
|
英数字以外の削除の仕方(高速処理法)(VB6.0)_3 (No.3の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 13:16
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][基本コード] * * キーワード:高速化,検索,文字列の連結,置換え,配列処理, * ***********************************************************************************
------------------------------------------------------------------ Re^4: 英数字以外の削除の仕方 - Renard 2004/06/01-13:40 No.9113 ------------------------------------------------------------------
配列をうまく使えれば、これが一番速かったです。
Private Sub Command4_Click() Dim lngStartTime As Long Dim strOneLineDat As String Dim strTemp(1 To 10000) As String Dim intLoop As Integer Dim dat As String Dim i As Integer strOneLineDat = "aAcd-0324-PあOI*POいL\AA" lngStartTime = timeGetTime For i = 1 To 10000 For intLoop = 1 To Len(strOneLineDat) dat = Mid$(strOneLineDat, intLoop, 1) If dat Like "[0-9A-Za-z]" Then strTemp(i) = strTemp(i) & dat End If Next intLoop Next i strOneLineDat = Join(strTemp, "") Label4.Caption = "timeGetTime : " & (timeGetTime - lngStartTime) / 1000 End Sub
|
|