gpt4 book ai didi

c# - 在 C# 中使用托管 API 的有效替代方法?

转载 作者:行者123 更新时间:2023-11-30 19:10:56 26 4
gpt4 key购买 nike

因此,如果我直接使用 kernel32 来删除我的文件作为示例,它会比这个 C# API 更有效吗?

System.IO.File.Delete(string Path);

如果我像这样导入 dll 并只使用 DeleteFile("C:.."):

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DeleteFile([MarshalAs(UnmanagedType.LPWStr)]string lpFileName);

在效率方面是否会更好,例如执行代码所需的时间?

最佳答案

托管代码运行缓慢是一种相当普遍的误解。通常不是,您执行的是 C 编译器生成的同一类代码,即机器代码。它尤其与大量作为操作系统功能包装器的 .Net 框架类无关。

类似于文件类。 File.Delete() 方法实际上调用了 DeleteFile() winapi 函数。必然如此,这是在 Windows 上删除文件的唯一方法。 .NET 框架无能为力,至少在托管操作系统可用之前是这样。这可能真的会在某一天发生,Microsoft 的 super secret Midori 项目旨在开发这样一个操作系统。

但那是 future 的音乐,现在它是一大块 C 代码,埋在 Fat32 或 NTFS 等文件系统驱动程序中,实际上可以完成工作。它以磁盘速度运行,DeleteFile() 在文件系统驱动程序确认删除完成之前不会返回。这是非常非常慢的。就像老式硬盘大约需要 50 毫秒,而固态硬盘则在亚毫秒范围内。

File.Delete() 确实 添加代码,它执行大量错误检查。如果验证您传递的参数不为空,则检查您的代码是否未在拒绝文件删除权的沙箱中运行,检查您是否未在路径中指定文件路径中不合法的任何字符,将增量路径转换为完整路径并检查它是否仍然是合法路径,检查路径字符串是否不太长,必要时将短 MS-Dos 8.3 名称转换为长名称。

这是一大堆工作,但以 微秒 衡量。如果你 pinvoke DeleteFile 那么你将跳过该代码,但你最多只能让它快 1% 左右。您将失去的是可靠性,即如果您的代码或数据出现错误,您会被告知的保证。有一个非常清楚的异常消息,可以告诉您到底出了什么问题。非常有值(value),因为那几微秒乘以十亿仍然比不上您将花费在调试不起作用的 DeleteFile() 上所花费的时间和痛苦。

不要这样做。

关于c# - 在 C# 中使用托管 API 的有效替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14308573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com