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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 >>
■82332  Re[3]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 10:49:16)
    ありがとうございます。

    Uintegerにする方法ですが
    これで良いでしょうか?


    Public Function GetCRC32_2(ByVal sFileName As String) As String

    Try
    Dim FS As FileStream = New FileStream(sFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
    Dim CRC32Result As Integer = &HFFFFFFFF
    Dim Buffer(4096) As Byte
    Dim ReadSize As Integer = 4096
    Dim Count As Integer = FS.Read(Buffer, 0, ReadSize)
    Dim CRC32Table(256) As Integer
    Dim DWPolynomial As Integer = &HEDB88320
    Dim DWCRC As Integer
    Dim i As Integer, j As Integer, n As Integer

    'Create CRC32 Table
    For i = 0 To 255
    DWCRC = i
    For j = 8 To 1 Step -1
    If (DWCRC And 1) Then
    DWCRC = ((DWCRC And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
    DWCRC = DWCRC Xor DWPolynomial
    Else
    DWCRC = ((DWCRC And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
    End If
    Next j
    CRC32Table(i) = DWCRC
    Next i

    'Calcualting CRC32 Hash
    Do While (Count > 0)
    For i = 0 To Count - 1
    n = (CRC32Result And &HFF) Xor Buffer(i)
    CRC32Result = (CRC32Result >> 8) Xor CRC32Table(CInt(n))
    Next i
    Count = FS.Read(Buffer, 0, ReadSize)
    Loop
    Return Hex(Not (CRC32Result))
    Catch ex As Exception
    Return ""
    End Try

    End Function



    CRC32Result だけuintegerにしましたが、
    計算結果が出力されません。
    CRCTableもuintegerにしてみましたが、
    CRCTableが出力されずに終了してしまいます。

    どうすれば良いでしょうか?
     
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82333  Re[4]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 10:52:51)
    すいません、勘違いでした

    二倍程度速くなりました。

    ありがとうございます。

    他の設定も試してみます
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82334  Re[5]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 12:00:04)
    いろいろと試してみたのですが
    教えてくださった通り
    uintegerにすることで2倍程度の高速化が実現できました。

    Option Strict Onは面倒なので試していません。
    これをするくらいならC#で書き直してDLLとして使用した方が良いのではないでしょうか?

    この状態で
    http://dobon.net/vb/dotnet/string/filemd5.html
    のMD5の計算と速度比較を行いましたが
    20〜30%程度CRC計算の方が遅いです。

    http://d.hatena.ne.jp/shiku_otomiya/20111026/p1
    このページによると
    CRCの方が逆に20〜30%程度高速であるはずなので、
    まだあと2倍程度高速化できる余地が残っていると思います。

    「対象のCPU」に関してですが

    https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/ae468f23-f3e5-4e0c-b744-326190c739f3?forum=vbgeneralja

    プロパティ>コンパイルタグ>コンパイラの詳細設定
    を見てみましたが設定箇所が見当たりませんでした

    VS2010のExpressを使っているためだと思います。

    「vbproj」ファイルを直接弄れば設定ができると思うのですが
    どこを変えれば良いですか?
    ファイル内をCPUで検索してもかからなかったので教えてください


記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82335  Re[6]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 12:08:29)
    何度もすいません、うまくいったと思ったのですが
    これも勘違いで宣言がintegerのままになっていました

    これでうまくいかないのですが何が問題でしょうか?

    Public Crc32Table2(255) As UInteger


    Private Sub InitCrc32Table2()

    Dim DWPolynomial As UInteger = &HEDB88320UI
    Dim DWCRC As UInteger

    'Create CRC32 Table
    For i = 0 To 255
    DWCRC = i
    For j = 8 To 1 Step -1
    If (DWCRC And 1) Then
    DWCRC = ((DWCRC And &HFFFFFFFEUI) \ 2&) And &H7FFFFFFFUI
    DWCRC = DWCRC Xor DWPolynomial
    Else
    DWCRC = ((DWCRC And &HFFFFFFFEUI) \ 2&) And &H7FFFFFFFUI
    End If
    Next j
    Crc32Table2(i) = DWCRC
    Next i


    End Sub


    Public Function GetCRC32_2(ByVal sFileName As String) As String


    If Crc32Table2(255) = 0 Then InitCrc32Table()


    Dim FS As FileStream = New FileStream(sFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
    Dim CRC32Result As UInteger = &HFFFFFFFFUI
    Dim Buffer(4096) As Byte
    Dim ReadSize As Integer = 4096
    Dim Count As Integer = FS.Read(Buffer, 0, ReadSize)
    Dim i As Integer, n As Integer


    'Calcualting CRC32 Hash
    Do While (Count > 0)
    For i = 0 To Count - 1
    n = (CRC32Result And &HFFUI) Xor Buffer(i)
    CRC32Result = (CRC32Result >> 8) Xor Crc32Table2(CInt(n))
    Next i
    Count = FS.Read(Buffer, 0, ReadSize)
    Loop
    Return Hex(Not (CRC32Result))

    End Function

記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82336  Re[7]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 12:11:14)
    何度も何度もすいません
    If Crc32Table2(255) = 0 Then InitCrc32Table()

    If Crc32Table2(255) = 0 Then InitCrc32Table2()

    にすればうまくいきました。

    あとは、CPUの設定の方法をお教え願えますでしょうか?

     
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82338  Re[8]: VBでCRC32を高速で計算する方法
□投稿者/ WebSurfer -(2017/01/04(Wed) 12:44:40)
    No82336 (ぎゅんぎゅ さん) に返信

    > あとは、CPUの設定の方法をお教え願えますでしょうか?

    プラットフォームターゲットのことであれば、ソリューションエクスプローラー
    で Properties を右クリックして開いて[ビルド]タブをクリックすれば出てき
    ます。
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82337  Re[6]: VBでCRC32を高速で計算する方法
□投稿者/ WebSurfer -(2017/01/04(Wed) 12:38:21)
    No82334 (ぎゅんぎゅ さん) に返信

    > これをするくらいならC#で書き直してDLLとして使用した方が良いのではないでしょうか?

    C# でもよければ以下の記事のものを試してみてはいかがですか? ソースはその記事から
    リンクを貼ってある GitHub のページにあります。

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

    質問者さんの作ったものより速いかどうかは分かりませんが・・・
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82339  Re[7]: VBでCRC32を高速で計算する方法
□投稿者/ Hongliang -(2017/01/04(Wed) 13:05:23)
    > Option Strict Onは面倒なので試していません。
    > これをするくらいならC#で書き直してDLLとして使用した方が良いのではないでしょうか?

    プロジェクト全体としてOnにすべきとまでは言いませんが。
    今回のように、できない、勘違いだった、やっぱりできてない、できた、というのを繰り返すぐらいなら、
    該当部分だけ別ファイル(のモジュール等)に切り出して、そのファイルだけOption Strict Onにしたほうがかえって手間が少なくなるかと思います。

    なお、ファイルから読み込んで全部のバイトを舐める、という作業自体の時間ってのが意外に掛かります。
    CRCの計算時間がMD5の計算時間より30%短いといっても、ファイル読込を含んだ総時間は多分大差ない程度に収まるはずです。
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82342  Re[8]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 13:47:49)
    Hongliangさん

    モジュールに分けてOption Strict Onをしてみましたが
    計算速度に違いは見られませんでした。

    WebSurferさん
    Professional版だと
    ソリューションエクスプローラー
    で Properties を右クリックして開いて[ビルド]タブ
    にあるのかも知れませんが
    Express版だとそこに設定がないのですが・・・
    vbprojファイルを直接いじる方法をご存じでしたら教えてください
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82343  Re[9]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta -(2017/01/04(Wed) 14:10:34)
    2017/01/04(Wed) 14:21:48 編集(投稿者)

    No82342 (ぎゅんぎゅ さん) に返信

    どこに時間がかかっていますか?
    手元の環境で実行しました。
    32ビットCPU 、567MBのファイル対象で約9秒でした。
    しかし、StopWatch クラスで計測場所を変えてみると、
    計算は約4秒、後はファイル読み込みでした。
    計算は、アルゴリズムの調整でなんとかなるかもしれませんが、
    ファイル読み込みの時間はどうにもなりません。
    一応、バッファサイズは4、8、16KBでやってみましたが、同じでした。

    CPU設定は、64ビットCPUで32ビットモードの実行ファイルを動かしている、ということでなければ無視して構いません。
    Expressなら、Any CPUになるはず。
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82346  Re[10]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 15:27:15)

    ありがとうございます。

    仰る通り、ファイルの読み込み速度が律速していると思いますが
    DLLを使えばもう少し速度を改善できると思います。

    それでDLLの呼び出し方を教えていただけないでしょうか?

    http://blog.systemjp.net/entry/2014/03/19/212653

    この方法を使って
    VBで作成したDLLファイルは
    VBで読み込むことができます。



    http://www.codeexperts.com/showthread.php?93-How-to-CRC-file-in-C

    それでこのページにあるコードをC#を使ってDLLを生成したものをVBで呼び出したいのですが
    同様の方法を使ってもうまくいきません。

    Dim obj As New ClassLibrary1.Class1()
    Dim obj As New ClassLibrary1.Program()
    Dim obj As New ClassLibrary1.crc()
    などを試してみましたが、エラーが出てしまいます。

    散々、検索して調べましたが
    VBからのC#のDLLの呼び出し方がよく分かりませんでした。


    どうすれば良いでしょうか?

記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82347  Re[11]: VBでCRC32を高速で計算する方法
□投稿者/ Azulean -(2017/01/04(Wed) 15:47:40)
    No82346 (ぎゅんぎゅ さん) に返信
    > http://www.codeexperts.com/showthread.php?93-How-to-CRC-file-in-C
    >
    > それでこのページにあるコードをC#を使ってDLLを生成したものをVBで呼び出したいのですが
    > 同様の方法を使ってもうまくいきません。

    基本的に、同じプロジェクト以外からは呼べない internal と呼ばれる可視性が C# のデフォルトになっています。
    プロジェクトの外から使えるようにするためには、クラスやメソッドに public という可視性を付与する必要があります。

    https://msdn.microsoft.com/ja-jp/library/ms173121.aspx
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82348  Re[12]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(2017/01/04(Wed) 16:17:42)
    ありがとうございます。


    public class Program
    {
    static uint[] crc32_table = new uint[256];
    static uint ulPolynomial = 0x04c11db7;


    public static void Main2(string filepath)
    {

    のようにしてクラスやメソッド
    publicをつけてみました

    しかし
    Dim obj As New ClassLibrary3.Program

    としてもやはり見つからないというエラーが出るのですが

記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82349  Re[13]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta -(2017/01/04(Wed) 16:46:43)
    4.1秒台だったのが3.7秒台になりましたが、
    ファイル読み込みを足すと9秒台が15秒台になりました。
    (C#のまま実行)
    ムダだと思いますよ。
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

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

    できれば、VBでも試してみたいので
    C#のDLLをVBで呼び出す方法をお教え願えないでしょうか?
     
    publicを宣言してもうまくいかないのですが
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82353  Re[15]: VBでCRC32を高速で計算する方法
□投稿者/ Jitta -(2017/01/04(Wed) 17:14:10)
    No82350 (ぎゅんぎゅ さん) に返信

    static宣言されているので、インスタンスを作りません。
    namesapace で宣言されているものに続けて、
    .program.Main()
    括弧の中は dim args() as string = {"パス名"} とかで。
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82352  Re[15]: VBでCRC32を高速で計算する方法
□投稿者/ Hongliang -(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メンバは型名からアクセスする必要があります。
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82354  Re[7]: VBでCRC32を高速で計算する方法
□投稿者/ WebSurfer -(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
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82355  Re[8]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ -(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)
    と毎回クラス名を入力する必要があります。

    これは仕様でしょうか?






記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

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

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

    もしかしてVBからC#のDLLを読み込むことで遅くなっているのでしょうか?
     
記事No.82326 のレス /過去ログ140より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 >>

ヒット件数が多いので過去ログ1〜140 までの検索結果 / 過去ログ141からさらに検索→

パスワード/

- Child Tree -