C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VBでCRC32を高速で計算する方法 [1]

[トピック内 95 記事 (21 - 40 表示)]  << 0 | 1 | 2 | 3 | 4 >>

■82350 / inTopicNo.21)  Re[14]: VBでCRC32を高速で計算する方法
  
□投稿者/ ぎゅんぎゅ (16回)-(2017/01/04(Wed) 16:51:55)
Jittaさん
わざわざ試してくださりご報告ありがとうございます。

できれば、VBでも試してみたいので
C#のDLLをVBで呼び出す方法をお教え願えないでしょうか?
 
publicを宣言してもうまくいかないのですが

引用返信 編集キー/
■82352 / inTopicNo.22)  Re[15]: VBでCRC32を高速で計算する方法
□投稿者/ Hongliang (483回)-(2017/01/04(Wed) 17:12:58)
たとえばこんな感じです。

namespace CrcLib {
  public class Crc {
    public static uint GetCrc32(byte[] buffer, ...) { ... }
    public static void InitCrcTable() { ... }
  }
}

Sub CalcCrc()
  CrcLib.Crc.InitCrcTable()
  Dim bytes As Byte()
  ...
  Dim result As UInteger = CrcLib.Crc.GetCrc32(bytes, ...)
End Sub

// C#のstaticメンバは型名からアクセスする必要があります。

引用返信 編集キー/
■82353 / inTopicNo.23)  Re[15]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta (249回)-(2017/01/04(Wed) 17:14:10)
No82350 (ぎゅんぎゅ さん) に返信

static宣言されているので、インスタンスを作りません。
namesapace で宣言されているものに続けて、
.program.Main()
括弧の中は dim args() as string = {"パス名"} とかで。
引用返信 編集キー/
■82354 / inTopicNo.24)  Re[7]: VBでCRC32を高速で計算する方法
□投稿者/ WebSurfer (1114回)-(2017/01/04(Wed) 17:26:32)
No82337 で紹介した、

> Calculating CRC-32 in C# and .NET  
> https://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net

で試してみましたが、511MB のファイルが 4 秒前後でした。ご参考まで

Option Strict On
Module Module1
    Sub Main()
        Dim crc32 As New ClassLibrary1.Crc32
        Dim hash As String = String.Empty
        Dim path As String = "C:\test.zip"

        Dim stopWatch As New Stopwatch
        stopWatch.Start()

        Using fs As System.IO.FileStream = System.IO.File.Open(path, System.IO.FileMode.Open)
            For Each b As Byte In crc32.ComputeHash(fs)
                hash += b.ToString("x2").ToLower()
            Next
        End Using

        stopWatch.Stop()
        Dim ts As TimeSpan = stopWatch.Elapsed
        Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                                    ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)

        Console.WriteLine("CRC-32 is {0}", hash)
        Console.WriteLine(elapsedTime, "RunTime")
    End Sub
End Module

引用返信 編集キー/
■82355 / inTopicNo.25)  Re[8]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (17回)-(2017/01/04(Wed) 18:12:31)
Hongliangさん

ありがとうございます。


うまくいきました。

ところで、
VBで作成したDLLの場合には

Dim obj As New ClassLibrary3.Program
CRC_hai = obj.GetCRC32(file)

のようにして、使うことができたのですが
C#で作成したDLLの場合には
これができず、
CRC_hai = ClassLibrary3.Program.GetCRC32(file)
と毎回クラス名を入力する必要があります。

これは仕様でしょうか?







引用返信 編集キー/
■82356 / inTopicNo.26)  Re[9]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (18回)-(2017/01/04(Wed) 21:02:59)
結局、VBで書いたものをC#に書き換えて、
DLL化してVBで呼んでみましたが
なぜか30%くらい遅くなってしまいました。
一般的にC#の方がVBよりも高速なのになぜでしょうか?

VBでDLL化したものをVBで読み込んでみると
なぜか10%くらいですか、速くなりました。

もしかしてVBからC#のDLLを読み込むことで遅くなっているのでしょうか?
 
引用返信 編集キー/
■82357 / inTopicNo.27)  Re[10]: VBでCRC32を高速で計算する方法
□投稿者/ Azulean (761回)-(2017/01/04(Wed) 21:17:28)
2017/01/04(Wed) 21:20:28 編集(投稿者)

No82356 (ぎゅんぎゅ さん) に返信
> 結局、VBで書いたものをC#に書き換えて、
> DLL化してVBで呼んでみましたが
> なぜか30%くらい遅くなってしまいました。
> 一般的にC#の方がVBよりも高速なのになぜでしょうか?

材料なしに断言できる人はいません。
推測でものを言うとすれば、その書き換えがよくない(不得手であるが故に非効率なコードを書いている)ことが有力候補ですが、ほかの理由もあるかもしれません。

キャストとか、四捨五入とか、比較とか、そういったコードが不用意に増やされているなら遅くなるとは思いますが。
(そのほか、大量の配列アクセスをしたいなら unsafe コンテキストやポインターの概念の理解も必要になるでしょうね)


> もしかしてVBからC#のDLLを読み込むことで遅くなっているのでしょうか?

VB.NET から VB.NET の DLL を呼ぶことと、VB.NET から C# の DLL を呼ぶことによる差は、基本的にはありません。
引用返信 編集キー/
■82358 / inTopicNo.28)  Re[10]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta (250回)-(2017/01/05(Thu) 08:56:36)
No82356 (ぎゅんぎゅ さん) に返信

> 一般的にC#の方がVBよりも高速なのに
この判断の根拠はなんですか。
まず、判断の根拠と観測結果を具体的に示してください。
具体的というのは、実行したCPUの型番、
搭載メモリ量、OSのSPを含むバージョン、
5~10回実行した平均値、位は最低限。


> もしかしてVBからC#のDLLを読み込むことで遅くなっているのでしょうか?
そう思うなら、その辺りの事を調べてみてはどうでしょうか。
引用返信 編集キー/
■82359 / inTopicNo.29)  Re[11]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (19回)-(2017/01/05(Thu) 10:26:00)
みなさん、ご回答ありがとうございます。

いったん、締め切らせていただきます。
 
解決済み
引用返信 編集キー/
■82361 / inTopicNo.30)  Re[12]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta (251回)-(2017/01/05(Thu) 11:23:29)
No82359 (ぎゅんぎゅ さん) に返信
> みなさん、ご回答ありがとうございます。
>
> いったん、締め切らせていただきます。
>  

あらら
一応、Cのライブラリ作ったら2秒台でした。
ただ、CRCの結果がVB.NET、C#、C、どれも異なるんだよなぁ。
ウェブからコピペしただけなのになぁ。。。
解決済み
引用返信 編集キー/
■82362 / inTopicNo.31)  Re[13]: VBでCRC32を高速で計算する方法
□投稿者/ ガラン (1回)-(2017/01/05(Thu) 12:12:31)
No82361 (Jitta さん) に返信
> ただ、CRCの結果がVB.NET、C#、C、どれも異なるんだよなぁ。
> ウェブからコピペしただけなのになぁ。。。

CRCはシフトの方向や初期値、生成多項式によって結果が変わります。
コピペするだけじゃなくてちゃんと理解してプログラムを書いてください。
ちゃんとやってください。(煽ってみる)

引用返信 編集キー/
■82363 / inTopicNo.32)  Re[14]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (21回)-(2017/01/05(Thu) 12:17:43)
> Cのライブラリ作ったら2秒台でした。

私もC++でDLLを作りたいのですが
その方法をどうかお教えください。
 
引用返信 編集キー/
■82366 / inTopicNo.33)  Re[15]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta (252回)-(2017/01/05(Thu) 14:18:47)
No82363 (ぎゅんぎゅ さん) に返信
>>Cのライブラリ作ったら2秒台でした。
>
> 私もC++でDLLを作りたいのですが
> その方法をどうかお教えください。
>  

あっちのスレに任せる。

ここの最初のVBのコードで、テーブルを作る式に誤りがあります。
貧弱な入力環境なので、個所の指定までは勘弁。
引用返信 編集キー/
■82387 / inTopicNo.34)  Re[16]: VBでCRC32を高速で計算する方法
□投稿者/ なちゃ (150回)-(2017/01/06(Fri) 08:41:22)
そもそもファイルのロードが含まれてるので、キャッシュ状況などで速度は全く変わります。
だから単純に計算速度知りたいなら計算だけの速度調べないと何ともいえません。
でロードと計算を単純に繰り返すやり方だと計算を最速ではできないので、どうやっても最大速度は出せないと思います。
ちなみに自作のC#のハッシュ計算ツールは、CRC32単体だと最速で2秒弱だった気がします。
※ただしPentiumM、ロードと計算は並列化しています。
ただし計算方法自体は特に凝ってません。

引用返信 編集キー/
■82388 / inTopicNo.35)  Re[17]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (40回)-(2017/01/06(Fri) 09:27:46)
なちゃさんロードと計算を並列化するにはどうしたら良いですか?

下のコードでマルチスレッドできるのは分かるのですが
計算した結果を得るにはどうしたら良いですか?
計算結果をパブリック変数にして、
元のスレッドで受け取るしかないですか?

MultiProgram_run = New System.Threading.Thread( _
New System.Threading.ParameterizedThreadStart(AddressOf Program_run1xx))
MultiProgram_run.IsBackground = True

MultiProgram_run.Start()

あと、既にフォームの動作をフォアグラウンドとして、
計算全体をバックグランドにしてあるのですが
バックグランドの計算の中で
更にバックグラウンド計算を行うことはできるのでしょうか?


引用返信 編集キー/
■82389 / inTopicNo.36)  Re[17]: VBでCRC32を高速で計算する方法
□投稿者/ なちゃ (151回)-(2017/01/06(Fri) 09:29:42)
No82387 (なちゃ さん) に返信
> そもそもファイルのロードが含まれてるので、キャッシュ状況などで速度は全く変わります。
> だから単純に計算速度知りたいなら計算だけの速度調べないと何ともいえません。
> でロードと計算を単純に繰り返すやり方だと計算を最速ではできないので、どうやっても最大速度は出せないと思います。

と思ったけどキャッシュにさえ乗ってればあまり影響なさそうな感じですね。
というか並列化したほうはよけいな処理で負荷になってる感じかな(そもそも異なるハッシュの並列計算用)。

ちなみにVB版のMD5が速いのは、VBなのに速いわけではなくて、内部ネイティブのライブラリを使用する版を使っているためです。
おそらく結構最適化されたC++版くらいのイメージです。
引用返信 編集キー/
■82390 / inTopicNo.37)  Re[18]: VBでCRC32を高速で計算する方法
□投稿者/ なちゃ (152回)-(2017/01/06(Fri) 09:33:38)

> ■No82388 (ぎゅんぎゅ さん) に返信
> なちゃさんロードと計算を並列化するにはどうしたら良いですか?
>
> 下のコードでマルチスレッドできるのは分かるのですが
> 計算した結果を得るにはどうしたら良いですか?
> 計算結果をパブリック変数にして、
> 元のスレッドで受け取るしかないですか?

いや、そんな単純な話じゃないので多分無駄です。
ロードと計算を並列にやる必要があります。
まあそのためにやるほどの価値は多分なさそうです。

引用返信 編集キー/
■82391 / inTopicNo.38)  Re[19]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (41回)-(2017/01/06(Fri) 09:39:51)
勉強のために
並列計算の仕方をお教え願えないでしょうか?

必要なキーワードやコードだけでも構わないので
教えてください
 
引用返信 編集キー/
■82392 / inTopicNo.39)  Re[20]: VBでCRC32を高速で計算する方法
□投稿者/ なちゃ (153回)-(2017/01/06(Fri) 09:57:19)
ちょっといくつか。
まず、並列化してもあまり意味なさそうと書いたのは計測結果の見間違いで、実際にはMD5の計測よりもさらに2割前後速くなっていました。
なので意味はありそうです。
ただし並列化はそこまで簡単ではないです。

計算処理を一定サイズのチャンク単位で繰り返すようにして、チャンク分の計算用にバッファ2こ用意します。
ロードを行うスレッドは全力でファイルを読み込み、バッファが一杯になれば計算スレッドに次のバッファが使えることを通知します。
計算スレッドは逆に、チャンクの計算が終わったら、前のバッファに続きを読み込んで良いことを、読み込みスレッドに通知します。
また読み込みスレッドから通知済みなら次のバッファの計算を開始します。
そういう感じでバッファを使い回ししながらそれぞれのスレッドができるだけ全力で走るようにします。
バッファを3つ使えばスレッド間調整がやや減らせそうですが、実質的にはあまり変わらなそうです。

引用返信 編集キー/
■82393 / inTopicNo.40)  Re[21]: VBでCRC32を高速で計算する方法
 
□投稿者/ ぎゅんぎゅ (42回)-(2017/01/06(Fri) 10:06:07)
ありがとうございます。

日本語で書くと簡単なのですが
VBを使って具体的にコードを書く場合にはどうしたら良いですか?

MultiProgram_run = New System.Threading.Thread( _
New System.Threading.ParameterizedThreadStart(AddressOf Program_run1xx))
MultiProgram_run.IsBackground = True

MultiProgram_run.Start()

このコードを使うというので合っていますか?

もっと良い方法があれば教えてください
 
引用返信 編集キー/

このトピックをツリーで一括表示

<前の20件 | 次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 | 4 >>

管理者用

- Child Tree -