R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

文字列の連結

今、VB6 のソフトの機能追加を行っている最中です。

そんな中、文字列の連結を高速化している自作クラスが目にとまったので、懐かしさついでに中身を公開してみます。


'********************************************************
' Strcat Class
' Memo: 高速文字連結クラス(短い文字を何度も連結する時に効果的)
'********************************************************
Private Const mDefBufSize = 65536   'デフォルトのサイズ

Private mText As String     '文字列を格納
Private mTextLength As Long     '現在の文字長
Private mBufSize As Long     '同時に確保する文字数

Private Sub Class_Initialize()
  mTextLength = 0
  mText = ""
  mBufSize = mDefBufSize
End Sub

'********************************************************
' Text Property
'********************************************************
Public Property Get Text() As String
  Text = Left$(mText, mTextLength)
End Property

Public Property Let Text(ByRef NewText As String)
  mText = NewText
  mTextLength = Len(mText)
End Property

'********************************************************
' BufSize Property
'********************************************************
Public Property Let BufSize(ByVal NewBufSize As Long)
  If (NewBufSize > 0) Then
    mBufSize = NewBufSize
  End If
End Property

'********************************************************
' Append Method
'********************************************************
Public Sub Append(AppendString As String)
  Dim L As Long: L = Len(AppendString)
  
  If (L = 0) Then
    Exit Sub
  End If
  
  If (Len(mText) < mTextLength + L) Then
    mText = mText & String$(mBufSize, 0)
  End If
  
  Mid$(mText, mTextLength + 1, L) = AppendString
  
  mTextLength = mTextLength + L
End Sub


使い方は以下の通りです。


Dim T As New Strcat
    
Dim i As Long
For i = 0 To 1000000
    Call T.Append("A")
Next
Debug.Print T.Text
End


どうして単純に以下のように書かないのか?


Dim T As String
    
Dim i As Long
For i = 0 To 1000000
    T = T & "A"
Next
Debug.Print T.Text
End


理由は簡単で、遅いからです。では何故遅いのでしょうか?

答えは「T = T & "A"」の処理で「変数 T 用の常に新しいメモリ空間に、既存の内容をコピーしているから」です。

つまり、上記を実行すると「T = T & "A"」の度に、以下の手順が繰り返されます。

(1)新しい T のエリアに今までの T の内容を全てコピー。
(2)その後に、"A" を付け加える。

そこで、最初に大きなメモリを確保して、有効な文字列の大きさの次の値を置き換えることで追加するようにしたのが、最初のクラスです。

以下のような処理になります。

最初:"---------------------------"
一回目"A--------------------------" 先頭の1文字を置き換える。
二回目"AA-------------------------" 末尾の1文字を置き換える。
二回目"AAA------------------------" 末尾の1文字を置き換える。

つまり、別の場所に A をコピーする手間がなくなるので、高速に処理できるということになります。

ところで、僕の大好きな .NetFramework2.0 では、同様に文字列の連結を高速にしてくれる次のようなクラス「StringBuilder」が最初から用意されています。

上記の例を置き換えると、次のようになります。


StringBuilder s = new StringBuilder();
for (int i = 0; i <= 1000000; ++i) {
  s.Append("A");
}
System.Diagnostics.Debug.WriteLine(s.ToString());


便利ですね。

投稿日時 : 2007年1月8日 10:28

Feedback

# re: 文字列の連結 2007/01/08 10:31 R・田中一郎

ところで今日も仕事です。あぁ忙しい忙しい。

ちなみに、インターフェイスのコメントのタイムスタンプと、この投稿のタイムスタンプの差で、この投稿内容に費やした時間がバレバレになるなぁ、と今気づいたり^^;

# re: 文字列の連結 2007/01/09 11:17 ぽぴ王子

パクッ

じゃなかった、面白かったのでコメント書きに来ました。
.NETやJavaなんかだと、string型の連結が目に見えて遅かったりするので、当然のことながらStringBuilder(.NET)なりStringBuffer(Java)なりを使うのが当然だと思いますが、VB6の場合ってこのクラスを使うことで速さが極端に変わったりするんでしょうか?
実装としてはなかなか面白いニャーと見てましたが、僕がVB6を使ってた頃はこんなこと全然しなかったので(文字列の連結に時間がかかるイメージがなかったのもある)。

っていうか自分で調べてみろよって話ですね。あとでやってみます。
(でもノートパソコンにしかVS6環境が入っていないのでめんどくさい)

ところで、ダブルクォーテーションは&quot;に変換したほうがいいのでは?とかソースを見ながら思った王子ですが、いかがでしょうか。

# re: 文字列の連結 2007/01/09 15:38 R・田中一郎

>が、VB6の場合ってこのクラスを使うことで速さが極端に変わったりするんでしょうか?

先のサンプルなら、大きく違いが出るのではないかと・・・

>っていうか自分で調べてみろよって話ですね。あとでやってみます。

今、VS2005 の SP1 あてている最中で、遅くて確認できないので宜しくですw

>ところで、ダブルクォーテーションは&quot;に変換したほうがいいのでは?とかソースを見ながら思った王子ですが、いかがでしょうか。

あれ?
これって.Textが変換してくれるものだと勝手に思ってました^^;

# re: 文字列の連結 2007/01/09 19:57 まどか

>VB6の場合ってこのクラスを使うことで速さが極端に変わったりするんでしょうか?

ファイルを読んでテキストボックスに順次追記するような場合がメジャーな例でしょうか。
Midを使うことは昔から技術情報や情報発信があったと思います。

現在、MSDNトップページに出てたりする。
http://support.microsoft.com/kb/306821/ja

# re: 文字列の連結 2007/01/10 0:14 ぽぴ王子

検証してみました。
# んー、リモートデスクトップって便利だなぁ。

田中さんのサンプルで25000回ずつやってみたところ、連結クラス使用で0.3秒、&で連結して36秒という結果になりました。ぜんぜん違いますね。
つーか、試してみて速かったから採用してるんだと思ったのだけど、この目で見てみたかったので改めて自分でもやってみました。

よく考えたら、同じ文字列を連結するのってやったことなかったような気もします。
あったとしてもStringBuilderみたいに比較対象になるモノがなかったので、連結することでまたコピーしなおすなんて思ってもみなかったのかも。

なんにせよ、勉強になりました。ありがとうございます。

# re: 文字列の連結 2007/01/10 11:38 R・田中一郎

まどか さん

>Midを使うことは昔から技術情報や情報発信があったと思います。

僕もどこかで見て、楽しそうなので作って見たのがきっかけでした。
FlexGrid コントロールにのセルにデータを配置する場合、Clip プロパティを使うと爆速になるので、最初に、このクラスを使ってまとめて文字列として連結して、Clip プロパティに渡してました。

・・・あ、これは後でネタにしよう。

----------------------------------
ぽぴ王子 さん

>検証してみました。

ありがとうございました。
僕も無事、SP1 のインストールが完了しました。
・・・でも、バージョン情報を眺めてもSP1の文字が発見できないのは何故?^^;

# re: 文字列の連結 2007/01/26 16:28 やすけ

こういうの探していたんです。

ありがとうございまーす。

# re: 文字列の連結 2007/01/29 12:59 R・田中一郎

どういたしましてー。

# 文字列置換 2008/01/11 11:04 R.Tanaka.Ichiro's Blog

文字列置換

# 文字列置換 2008/01/11 11:05 R.Tanaka.Ichiro's Blog

文字列置換

# vXcOJDXrLNWfVS 2012/01/04 6:25 http://www.kosherbeefjerky.net/

YiE5lj Yet, much is unclear. Could you describe in more details!...

# fMiBHnhQKNWoXcUp 2013/03/22 22:39 http://crork.com/

uAQpwy Looking forward to reading more. Great post.Much thanks again.

# tGFkKZdqvoWXjcMbFFC 2018/12/17 7:21 https://www.suba.me/

FMtXx8 This is a great tip especially to those new to the blogosphere. Short but very accurate info Appreciate your sharing this one. A must read article!

# BQDQawrDlRdyxHIyP 2018/12/19 22:15 https://www.suba.me/

pauors This unique blog is really educating and also diverting. I have chosen many handy advices out of this amazing blog. I ad love to go back again and again. Cheers!

# KGshCFSxFo 2019/04/16 4:25 https://www.suba.me/

hvv0mO Wow, wonderful blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is great, as well as the content!

# hTiBYKvKfGfEH 2019/04/19 19:41 https://www.suba.me/

ejx3Xz Thanks a lot for the post.Much thanks again. Really Great.

# TvSSsJfQomC 2019/04/26 21:44 http://www.frombusttobank.com/

There is perceptibly a bundle to identify about this. I feel you made various good points in features also.

# XXRsmQMhwyRTif 2019/04/29 19:46 http://www.dumpstermarket.com

You have made some really good points there. I looked on the web to learn more about the issue and found most people will go along with your views on this website.

# dhxpIqBykPW 2019/04/30 20:04 https://cyber-hub.net/

I think other website proprietors should take this site as an model, very clean and great user friendly style and design, let alone the content. You are an expert in this topic!

# TfqCLKxAfAQDg 2019/05/01 7:20 https://parispetersen.yolasite.com/

Im obliged for the post.Really looking forward to read more. Much obliged.

# khEasLIXZx 2019/05/01 18:05 https://www.budgetdumpster.com

There as definately a great deal to find out about this issue. I really like all the points you ave made.

# ljgbqLUdZRpEZIDcq 2019/05/01 20:46 https://mveit.com/escorts/australia/sydney

I welcome all comments, but i am possessing problems undering anything you could be seeking to say

# AsPqlLutyc 2019/05/01 20:47 http://030702.com/__media__/js/netsoltrademark.php

Wow, great article.Much thanks again. Keep writing.

# OeFFcQLpksgOYwz 2019/05/01 22:35 http://all4webs.com/guitarpush5/aibblbomit755.htm

Very neat article.Thanks Again. Keep writing.

# oxycolAgijimkes 2019/05/02 20:51 https://www.ljwelding.com/hubfs/tank-fit-up-bed-sy

When someone writes an post he/she retains the idea of a

# DBDmjjOwoGdOTJtGsw 2019/05/02 22:40 https://www.ljwelding.com/hubfs/tank-growing-line-

What as up, I would like to say, I enjoyed this article. This was helpful. Keep going submitting!

# XEHxWEjdOJmJ 2019/05/03 11:50 http://xn--b1adccaenc8bealnk.com/users/lyncEnlix35

I truly enjoy looking at on this website , it contains fantastic articles.

# OYfOtiqJOiZKJwWcY 2019/05/03 15:38 https://www.youtube.com/watch?v=xX4yuCZ0gg4

What information technologies could we use to make it easier to keep track of when new blog posts were made and which blog posts we had read and which we haven at read? Please be precise.

# FbwjnFXQnvy 2019/05/03 16:14 https://mveit.com/escorts/netherlands/amsterdam

I value the article.Thanks Again. Fantastic.

# QbAwotkVDzsoFTnCdY 2019/05/03 18:02 http://www.sla6.com/moon/profile.php?lookup=287419

Wow, superb blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your web site is magnificent, let alone the content!

# FVfDHiiishqw 2019/05/03 19:06 https://mveit.com/escorts/australia/sydney

Thanks for helping out, superb info. а?а?а? Hope is the denial of reality.а? а?а? by Margaret Weis.

# LqWFdGRKgaMy 2019/05/03 20:25 https://talktopaul.com/pasadena-real-estate

Your weblog is wonderful dude i love to visit it everyday. very good layout and content material ,

# cnFHXdMzbOeHjYy 2019/05/03 21:13 https://mveit.com/escorts/united-states/houston-tx

Incredible points. Outstanding arguments. Keep up the good effort.

# UTNxedgGteuofjXhH 2019/05/03 22:29 https://mveit.com/escorts/united-states/los-angele

Really informative blog post.Really looking forward to read more. Really Great.

# KOnXiPCDzhFAGGZ 2019/05/04 3:35 https://timesofindia.indiatimes.com/city/gurgaon/f

You are my aspiration, I own few blogs and sometimes run out from post . Yet do I fear thy nature It is too full o a the milk of human kindness. by William Shakespeare.

# IwPpSBGAXDhLaT 2019/05/05 19:23 https://docs.google.com/spreadsheets/d/1CG9mAylu6s

These are actually enormous ideas in on the topic of blogging. You have touched some pleasant points here. Any way keep up wrinting.

# xHkBIwzLlz 2019/05/07 16:33 https://www.newz37.com

This will be a great web site, might you be involved in doing an interview regarding how you developed it? If so e-mail me!

# gKzTxoNsuwqWbgqncFJ 2019/05/07 17:41 https://www.gbtechnet.com/youtube-converter-mp4/

The information and facts talked about within the post are some of the top out there

# rfItyDCzcEMoo 2019/05/08 20:12 https://ysmarketing.co.uk/

There as certainly a lot to know about this topic. I love all the points you ave made.

# yNgoydwixuTLY 2019/05/09 3:28 http://www.magcloud.com/user/elleforbes

very handful of web-sites that transpire to become comprehensive beneath, from our point of view are undoubtedly very well worth checking out

# wSIPPJfQXq 2019/05/09 7:47 http://www.video-bookmark.com/watch/3583371/cheap-

woh I am cheerful to find this website through google.

# bnGHqkkKMt 2019/05/09 13:20 https://www.adsoftheworld.com/user/coltonrosales

These types %anchor% are so trend setting together with amazing, really beneficial.

# wLJgqqXnrYHNlbTyW 2019/05/09 16:10 http://chavez3792ju.wickforce.com/they-ook-wonderf

I will immediately grasp your rss as I can at to find your e-mail subscription hyperlink or newsletter service. Do you have any? Please allow me realize so that I may subscribe. Thanks.

# kmAMShSFYKjIsXPexJ 2019/05/10 5:11 https://totocenter77.com/

You could definitely see your enthusiasm in the work you write. The world hopes for more passionate writers like you who aren at afraid to say how they believe. Always go after your heart.

# kuaPrqaFjiAEG 2019/05/10 12:20 https://discover.societymusictheory.org/story.php?

Incredible story there. What occurred after? Take care!

# alZSyauOUY 2019/05/10 15:45 http://4wishes.com/__media__/js/netsoltrademark.ph

magnificent points altogether, you just won a logo new reader. What might you suggest in regards to your submit that you made some days ago? Any sure?

# pLYqfJoVzXRSd 2019/05/10 21:12 http://classifiedsadsnow.online/profile.php?sectio

It as onerous to find knowledgeable folks on this matter, however you sound like you already know what you are speaking about! Thanks

# gAQfdJicahdESrbRv 2019/05/13 0:37 https://www.mjtoto.com/

wow, awesome blog.Really looking forward to read more. Keep writing.

# BrKKhuVVLvfaGiUuFSV 2019/05/13 1:46 https://reelgame.net/

Muchos Gracias for your post.Much thanks again.

# XHAdjyKGSqjakUM 2019/05/14 0:23 http://july17.org/__media__/js/netsoltrademark.php

Wow, superb blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your website is wonderful, as well as the content!

# FBlvIdCynjOmpGqKm 2019/05/14 2:30 https://www.navy-net.co.uk/rrpedia/Top_Rated_Sugge

only two thousand from the initial yr involving the starting

# HKZzkePANvsOyAw 2019/05/14 10:32 http://moraguesonline.com/historia/index.php?title

I regard something really special in this site.

# WVgNUvnYZdd 2019/05/14 20:33 https://bgx77.com/

indeed, research is paying off. Great thoughts you possess here.. Particularly advantageous viewpoint, many thanks for blogging.. Good opinions you have here..

# PdePyEXIYC 2019/05/15 1:15 https://www.mtcheat.com/

You got a very good website, Glad I observed it through yahoo.

# VEexSMurgZiwvVEMj 2019/05/15 4:32 http://www.jhansikirani2.com

Terrific work! That is the type of info that should be shared across the net. Disgrace on Google for no longer positioning this put up higher! Come on over and seek advice from my web site. Thanks =)

# aauHxeRtduTx 2019/05/15 20:42 https://fb10.ru/medicina/allergiya-kashel/

Very good article.Much thanks again. Want more.

# SLvSaGLZbCqQkof 2019/05/16 23:36 https://www.mjtoto.com/

I value the blog article.Much thanks again. Great.

# rEVVjYVcHLRLktGM 2019/05/17 3:06 https://discover.societymusictheory.org/story.php?

This is a great tip particularly to those fresh to the blogosphere. Brief but very precise information Thanks for sharing this one. A must read post!

# TOSfMPikfhqmvug 2019/05/17 19:38 https://www.youtube.com/watch?v=9-d7Un-d7l4

Im obliged for the article.Thanks Again. Fantastic.

# caRPWlFcQE 2019/05/18 2:41 https://tinyseotool.com/

Thanks for the blog article.Thanks Again. Awesome.

# IheBXJrRzLzHBUrIB 2019/05/18 3:10 http://www.gadgetsneatstuff.com/__media__/js/netso

PlаА а?а?аА а?а?se let me know where аАа?аБТ?ou got your thаА а?а?mаА а?а?.

# VrIHmCwUONxGjuUWyD 2019/05/18 7:29 https://totocenter77.com/

You are my aspiration , I own few web logs and very sporadically run out from to brand.

タイトル  
名前  
Url
コメント