相关疑难解决方法(0)

为什么要使用Mono?

使用Mono over Java(或任何其他"免费"或Linux友好语言/运行时)的主要好处是什么?

Mono将始终追溯.NET框架的最新发展,你为什么要使用Mono而不是其他传统的开源语言/框架(Java)呢?

编辑:像下面提到的人一样,我想根本问题是,你为什么要在Linux平台上使用.NET?

.net java linux mono

33
推荐指数
4
解决办法
6008
查看次数

C#中的x86/x64 CPUID

我的其他问题相关,请帮我调试"未知模块中发生未处理的类型'System.AccessViolationException'异常.附加信息:尝试读取或写入受保护的内存.这通常表明其他内存已损坏." 逐步执行代码,一切都会一直运行,直到实际调用del()并在该行中失败.

这段代码基于本文的示例python代码,它在python中运行.我无法得到代码示例,因为它可以工作(相同的例外),但我希望它只是有点过时或者其他东西.

编辑:如果你关心我们如何到达这里,看看编辑历史,这是无趣的.

完成工作版:

public static class CpuID
{
    public static byte[] Invoke(int level)
    {
        IntPtr codePointer = IntPtr.Zero;
        try
        {
            // compile
            byte[] codeBytes;
            if (IntPtr.Size == 4)
            {
                codeBytes = x86CodeBytes;
            }
            else
            {
                codeBytes = x64CodeBytes;
            }

            codePointer = VirtualAlloc(
                IntPtr.Zero,
                new UIntPtr((uint)codeBytes.Length),
                AllocationType.COMMIT | AllocationType.RESERVE,
                MemoryProtection.EXECUTE_READWRITE
            );

            Marshal.Copy(codeBytes, 0, codePointer, codeBytes.Length);

            CpuIDDelegate cpuIdDelg = (CpuIDDelegate)Marshal.GetDelegateForFunctionPointer(codePointer, typeof(CpuIDDelegate));

            // invoke
            GCHandle handle = default(GCHandle);
            var buffer = new byte[16];

            try
            { …
Run Code Online (Sandbox Code Playgroud)

c# inline-assembly cpuid

31
推荐指数
3
解决办法
2万
查看次数

如何让这个C#循环更快?

执行摘要:如果你想留在C#中,Reed的答案是最快的.如果你愿意为C++(我是)编组,这是一个更快的解决方案.

我在C#中有两个55mb的ushort数组.我使用以下循环组合它们:

float b = (float)number / 100.0f;
for (int i = 0; i < length; i++)
{
      image.DataArray[i] = 
          (ushort)(mUIHandler.image1.DataArray[i] + 
          (ushort)(b * (float)mUIHandler.image2.DataArray[i]));
}
Run Code Online (Sandbox Code Playgroud)

根据之前和之后添加DateTime.Now调用,此代码需要3.5秒才能运行.我怎样才能让它更快?

编辑:我认为这是一些代码,它显示了问题的根源.当在全新的WPF应用程序中运行以下代码时,我得到这些计时结果:

Time elapsed: 00:00:00.4749156 //arrays added directly
Time elapsed: 00:00:00.5907879 //arrays contained in another class
Time elapsed: 00:00:02.8856150 //arrays accessed via accessor methods
Run Code Online (Sandbox Code Playgroud)

因此,当数组直接行走时,时间比数组在另一个对象或容器内的时间快得多.此代码显示,不知何故,我使用的是访问器方法,而不是直接访问数组.即便如此,我似乎能够获得的最快速度是半秒钟.当我使用icc在C++中运行第二个代码列表时,我得到:

Run time for pointer walk: 0.0743338
Run Code Online (Sandbox Code Playgroud)

在这种情况下,C++的速度提高了7倍(使用icc,不确定msvc是否可以获得相同的性能 - 我对那里的优化并不熟悉).有没有办法让C#接近C++性能水平,或者我应该让C#调用我的C++例程?

清单1,C#代码:

public class ArrayHolder
{
    int length;
    public ushort[] output;
    public ushort[] input1;
    public ushort[] input2;
    public ArrayHolder(int …
Run Code Online (Sandbox Code Playgroud)

c# performance

14
推荐指数
2
解决办法
1万
查看次数

C#中更快的矩阵乘法

我有一个涉及矩阵的小型c#项目.我通过将其分成n长度的块,将chucks作为向量处理,并乘以Vandermonde**矩阵来处理大量数据.问题是,根据条件,卡盘的尺寸和相应的Vandermonde**矩阵可以变化.我有一个易于阅读的通用解决方案,但速度太慢:

    public byte[] addBlockRedundancy(byte[] data) {
        if (data.Length!=numGood) D.error("Expecting data to be just "+numGood+" bytes long");

        aMatrix d=aMatrix.newColumnMatrix(this.mod, data);
        var r=vandermonde.multiplyBy(d);
        return r.ToByteArray();
    }//method
Run Code Online (Sandbox Code Playgroud)

这可以在我的i5 U470 @ 1.33GHz上处理大约每秒1/4兆字节.我可以通过手动内联矩阵乘法来加快速度:

        int o=0;
        int d=0;
        for (d=0; d<data.Length-numGood; d+=numGood) {
            for (int r=0; r<numGood+numRedundant; r++) {
                Byte value=0;
                for (int c=0; c<numGood; c++) {
                    value=mod.Add(value, mod.Multiply(vandermonde.get(r, c), data[d+c]));
                }//for
                output[r][o]=value;
            }//for
            o++;
        }//for
Run Code Online (Sandbox Code Playgroud)

这可以每秒处理大约1兆.

(请注意,"mod"正在GF(2 ^ 8)上模拟我最喜欢的不可约多项式.)

我知道这可以快得多:毕竟,Vandermonde**矩阵大多是零.我应该能够制定一个例程,或找到一个例程,它可以取我的矩阵并返回一个优化的方法,它将有效地将矢量乘以给定的矩阵,但速度更快.然后,当我给这个例程一个5x5 Vandermonde矩阵(单位矩阵)时,根本没有算术要执行,原始数据只是被复制.

**请注意:我使用的术语"Vandermonde",实际上是指一个Identity矩阵,其中附加了Vandermonde矩阵中的一些行(请参阅注释).这个矩阵很棒,因为所有的零,并且因为如果你删除足够的行(你选择的)使它成为正方形,它是一个可逆矩阵.当然,我想使用相同的例程将这些反转矩阵中的任何一个转换为优化的指令系列.

如何使这种矩阵乘法更快?

谢谢!

(编辑以纠正我与Vandermonde矩阵的错误)

c# matrix matrix-multiplication

9
推荐指数
1
解决办法
6200
查看次数

在 C# 中使用 SSE 4.2 crc32 算法?是否可以?

我必须对很多文件以及大文件(几 GB)计算 crc32。我尝试了在网上找到的几种算法,例如Damiengthis,它可以工作,但速度很慢(超过 1 分钟)。我在各种 crc32 算法上找到了这个基准测试,发现 sse 4.2 有硬件加速 crc32 方法。

我没有找到任何使用 SSE crc32 代码的 c# 代码示例。

1 - 有可能吗?

2 - 如何检测当前CPU是否支持SSE4.2?(切换crc32方法)

(如果可能,请提供代码示例)

c# crc32 cryptography sse

4
推荐指数
1
解决办法
1919
查看次数

在C#中使用SSE

我目前正在使用C#对应用程序进行编码,因为相对较小的代码会导致90-95%的执行时间.代码本身也非常适合SSE(因为它是矩阵和基于矢量的),所以我继续开始使用Mono.Simd,尽管这在执行时间上有显着差异,但这仍然不够.Mono.Simd的问题在于它只有非常旧的SSE指令(主要来自SSE1和SSE2,我相信),这导致dotproduct(或标量/内积)例如占用3条指令,而它可以是仅在一条指令中使用SSE4实现(并且自2006年以来SSE4可用,可以安全地假设现在每台现代计算机都有它).此外,根本不包括许多其他功能(例如,获取每个数字的绝对值,这也需要一个笨拙的解决方法).

我的问题是,我可以在我的C#代码中调用任何其他库来使用SSE/SIMD吗?也可以在C#中使用内联汇编,所以显然我也可以使用C++代码,即使这会导致性能损失很小,但如果有人会有一个相对易于使用的C++库,那么这是可以接受的我猜.

在此先感谢您的帮助.

c# sse simd

4
推荐指数
1
解决办法
1万
查看次数

为什么数组初始化总是求助于int?

阅读所有可能的C#数组初始化语法我想知道为什么C#总是推断int/Int32一个较小数据类型的数组,例如byte或者short就足够了.

new[] { 30, 130, 230 } // sbyte[] suffices but becomes int[]
new[] { -1, 125, -119 } // sbyte[] suffices  but becomes int[]
new[] { -31647, -1337, 23456} // short suffices but becomes int[]
Run Code Online (Sandbox Code Playgroud)

在引用的问题中,Eric Lippert表示使用了"最佳类型" - 见下文,但int最好的类型是怎样的?如果我们想要矫枉过正,为什么不使用long呢?

数组元素的类型是通过计算具有类型的所有给定元素的最佳类型(如果有的话)来推断的.所有元素必须可以隐式转换为该类型.

我怀疑处理8位或16位数据类型可能比32位结构更快,例如当使用SIMD时,其中四个byte实例可以适合一个寄存器空间int/Int32.我知道JIT编译器没有(广泛地)使用SSE指令,但是" int无处不在"的这种使用确保了当JIT编译器将包含这样的优化时它将没有多大帮助.

有人可以详细说明这些事实,并告诉它为什么总是采取行动int

//编辑// 我真的不关心那些规定没有前缀的文字应该被认为是规范的规范int.重新解释一下这个问题:

为什么使用的数据类型比需要的大?为什么规范对文字有这个规则? 有什么好处,因为巨大的缺点是远离未来(SIMD)的优化.

c# arrays type-conversion array-initialization

4
推荐指数
1
解决办法
297
查看次数

跨平台应用.需要建议

我需要开发一个适用于Mac,Windows和*nix的应用程序.该应用程序将不得不处理大量的数据,并将必须显示大图(因此需要一些2D绘图).我应该去Java吗?wxWidgets的?为每个平台开发一个版本?哦,只是出于好奇,如果我想为网络构建这个应用程序,你认为它会是多么可行?任何建议都非常感谢.

谢谢

java wxwidgets cross-platform

1
推荐指数
1
解决办法
236
查看次数