相关疑难解决方法(0)

CLR 内部调用是用什么语言编写的?

Pro .NET Performance - Optimize Your C# Applications中第 86 页的底部,它谈到了 的实现ValueType.Equals()并说:

的定义CanCompareBitsFastEqualsCheck被推迟到CLR,它们是“内部通话”,在IL未实现

“内部调用”究竟是什么,如果不是 IL,它们是用什么语言实现的?

.net c# clr cil

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

幂函数是否在恒定时间内运行?

当我使用 C# 中的 Math.Pow(double x, double y) 或 C++ 中的 math.h pow 函数等幂函数时,这些函数是否以恒定时间运行?

我问的原因是因为我想知道形式 (1-t)^n*p0 + ... + t^(n) * pN 上的“预先计算的”贝塞尔函数是否可以在线性时间内运行,这可以然后比以控制点和 t 作为参数的 De Casteljaus 算法的实现更快。

math bezier time-complexity

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

Atan2如何在.NET中实现?

我在反射器中寻找Atan2的.NET实现,并找到以下行:

public static extern double Atan2(double y, double x);
Run Code Online (Sandbox Code Playgroud)

这并不奇怪,因为大多数算术函数都是用本机代码实现的.但是,没有与System.Math中的此函数或其他函数关联的DllImport调用.

核心问题是如何在本机代码中实现该功能,但我也想知道它所在的原生Dll.另外,为什么没有DllImport?那是因为编辑将它剥离了吗?

.net c# math

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

Math.Pow(等等)如何实际工作

所以我谷歌搜索了很长时间,我几乎找不到任何东西.我从这个url找到了一些关于可能实现Math.Pow的信息,但它们是不准确的,例如这段代码

public static double PowerA(double a, double b)
{
    int tmp = (int)(BitConverter.DoubleToInt64Bits(a) >> 32);
    int tmp2 = (int)(b * (tmp - 1072632447) + 1072632447);
    return BitConverter.Int64BitsToDouble(((long)tmp2) << 32);
}
static void Main(string[] args)
{
    double x = 12.53, y = 16.45;
    Console.WriteLine(Math.Pow(x, y));
    Console.WriteLine(PowerA(x, y));
}
Run Code Online (Sandbox Code Playgroud)

提供输出:

1,15158266266297E+18
8,9966384455562E+17
Run Code Online (Sandbox Code Playgroud)

如此不准确......

我当时认为它的作用类似于一系列,但我不确定.

.net c# algorithm disassembly pow

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

随机数生成器安全性:BCryptGenRandom 与 RNGCryptoServiceProvider

对于那些赶时间,这是相关的争议Dual_EC_DRBG埋下NIST的SP800-90A内。

关于两个RNG:

  1. Microsoft BCRYPT 层基于他们的 C API。BCryptGenRandom遵循 NIST SP800-90A CTR_DRBG(即使用经批准的分组密码 AES 来创建随机位)。但是,尚不清楚它是否使用硬件随机源作为种子(或种子的一部分)......

  2. Microsoft .NETRNGCryptoServiceProvider是基于 C# 的。查看.NET 源代码(或此处),我看到它最终调用了 C++ 方法CapiNative.GenerateRandomBytes()。C#=>C++ 转换应该有一个 P/Invoke 存根,但我在框架源代码中的任何地方都找不到它。所以我不知道它是如何实际实施的。

有没有人有关于这两个随机数生成器的其他信息?是否使用 HW 随机种子(通过旧英特尔中的二极管噪声或RDRAND最新英特尔中的争议)。

PS:不确定这应该在安全、StackOverflow 或密码学...

.net c# security random cryptography

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

在C中定义和实现pow函数在哪里?

我读到pow(double,double)函数在"math.h"中定义,但我找不到它的声明.

有人知道这个函数声明的位置吗?它在C中实现的位置?

参考:

http://publications.gbdirect.co.uk/c_book/chapter9/maths_functions.html

c function declare pow

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

可以检查核心C#功能的内部

今天我很震惊,有比较内心的倾向Buffer.BlockCopy,Array.CopyTo. 我很好奇,看看是否在幕后Array.CopyTo被召唤Buffer.BlockCopy.这背后没有实际用途,我只想进一步了解C#语言及其实现方式.不要跳枪并指责我微观优化,但你可以指责我好奇!

当我在mscorlib.dll上运行ILdasm时,我收到了这个 Array.CopyTo

.method public hidebysig newslot virtual final 
    instance void  CopyTo(class System.Array 'array',
                          int32 index) cil managed
{
  // Code size       0 (0x0)
} // end of method Array::CopyTo
Run Code Online (Sandbox Code Playgroud)

这个 Buffer.BlockCopy

.method public hidebysig static void  BlockCopy(class System.Array src,
                                            int32 srcOffset,
                                            class System.Array dst,
                                            int32 dstOffset,
                                            int32 count) cil managed internalcall
{
  .custom instance void System.Security.SecuritySafeCriticalAttribute::.ctor() = ( 01 00 00 00 ) 
} // end of method Buffer::BlockCopy
Run Code Online (Sandbox Code Playgroud)

坦率地说,这令我感到困惑.我从未在我没有创建的dll/exe上运行ILdasm.这是否意味着我将无法看到这些功能是如何实现的?搜索周围只显示了一个stackoverflow问题 …

c# implementation il mscorlib

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

数学库与 C# 中自己的库

所以我们尝试用 C# 开发一个数学类,我们做到了。将结果与 System.Math 的原始数学类进行比较表明我们总是迟到一点或很多(特别是触发方法)。

但是当我们使用像 Absolut value 这样不包含大量代码的基本方法时,奇迹就出现了

if(value < 0) return -value;
else return value;
Run Code Online (Sandbox Code Playgroud)

我们仍然远远落后。

我不能让这个 abs 方法更小,我猜使用三元运算符也无济于事。

是因为 System.Math 是用 C 编写的吗?如果我们用母语写它会不会更快,尽管我读过它似乎不会改变太多。最后,一个 dll 能不能比一个类工作得更快,如果是,为什么,如果不是......为什么呢?

已经谢谢了。

.net c# math performance lib

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

在调用c ++函数时,CLR如何避免thunking?

MSDN声明:

无论使用何种互操作技术,每次托管函数调用非托管函数时都需要特殊的转换序列(称为thunks),反之亦然.这些thunk是由Visual C++编译器自动插入的,但重要的是要记住,累积起来,这些转换在性能方面可能很昂贵.

然而,CLR肯定会一直调用C++和Win32函数.为了处理文件/网络/窗口以及几乎任何其他内容,必须调用非托管代码.它是如何摆脱分块惩罚的?

这是一个用C++/CLI编写的实验,可能有助于描述我的问题:

#define REPS 10000000

#pragma unmanaged
void go1() {
    for (int i = 0; i < REPS; i++)
        pow(i, 3);
}
#pragma managed
void go2() {
    for (int i = 0; i < REPS; i++)
        pow(i, 3);
}
void go3() {
    for (int i = 0; i < REPS; i++)
        Math::Pow(i, 3);
}

public ref class C1 {
public:
    static void Go() {
        auto sw = Stopwatch::StartNew();
        go1();
        Console::WriteLine(sw->ElapsedMilliseconds);
        sw->Restart();
        go2();
        Console::WriteLine(sw->ElapsedMilliseconds);
        sw->Restart();
        go3();
        Console::WriteLine(sw->ElapsedMilliseconds); …
Run Code Online (Sandbox Code Playgroud)

c# c++ c++-cli

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

是否有任何内置的.NET替代方案可以使用数字(Math.Pow)的功能而没有错误?

Math.Pow似乎无法正常工作以取得重大成果.可能是因为它double用于计算(如何在.NET Framework中实现Math.Pow()?).

例如:

public static void Main()
{
    Console.WriteLine((long)Math.Pow(17, 13));
    Console.WriteLine(Pow(17, 13));
}

public static long Pow(int num, int pow)
{
    long answer = 1;
    for (int i = 0; i < pow; i++)
    {
        answer *= num;
    }

    return answer;
}
Run Code Online (Sandbox Code Playgroud)

上面代码的结果是:

9904578032905936
9904578032905937
Run Code Online (Sandbox Code Playgroud)

是否有任何内置的.NET替代方案可以使用数字的功能而没有错误?

.net c# double-precision pow

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

C#Math.Pow(-2,1.1)> n.def

我刚刚发现,当输入负x和小数y时,Math.Pow()返回未定义的值作为结果,这是错误的我猜.在其他程序中计算,即使像Windows计算器也可以使用正确的结果.此案例也未在文档中提及.

目标框架是4.

有谁能解释一下?

c# math type-conversion pow

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