- 主题:出乎意料,C++和dotnet6比dotnet5慢10% (转载)
是的,惊呆了。
不会用赖语言,不过这可能是软件工程行业劣币驱逐良币的大趋势。
- 来自 水木社区APP v3.5.3
【 在 z16166 的大作中提到: 】
: C#都知道用引用,然后用C++写居然不用引用?
--
FROM 183.179.53.*
是不是没开优化:)
- 来自 水木社区APP v3.5.3
【 在 finlab 的大作中提到: 】
: 用vc++2022版测试, 6.55秒, 还是明显比c#慢。
--
FROM 183.179.53.*
普通人C++恐怕写对都难。
然而普通人C#也写不对,只不过出问题的时候会抛异常,不像C++会出现奇怪的后果。
Java同理。
在写对的情况下,C++就是性能的上限,不用在上线两个月后整天调虚拟机然后发现不可能调好。
- 来自 水木社区APP v3.5.3
【 在 finlab 的大作中提到: 】
: 高品质的C++代码肯定比C#快。
:
: 但是我想了解的是普通人写的,没有高度优化的“正常”代码。
:
: 这种情况下对大多数人才有意义。
--
FROM 183.179.53.*
都开了, 对速度最优化
【 在 fanci 的大作中提到: 】
: 是不是没开优化:)
: - 来自 水木社区APP v3.5.3
--
FROM 123.112.64.*
没用过c#,但是类比java,我猜c#也有jit的机制,对重复的循环做字节码的优化,所以跑这种benchmark比较快。
c#能否像java一样,关掉jit,再测试下?
【 在 finlab 的大作中提到: 】
: 代码还是发不出来。 ...
--
FROM 101.84.170.*
别放空炮, 写一个明显比C#快的版本出来。
【 在 fanci 的大作中提到: 】
: 是的,惊呆了。
: 不会用赖语言,不过这可能是软件工程行业劣币驱逐良币的大趋势。
: - 来自 水木社区APP v3.5.3
--
FROM 123.112.64.*
我这里测试,c++比.net 5的慢一点点,
但是c++把那个new提出来之后,比.net 5的要快一点点。
但是c++再把那个new放回原位后,跟.net 5的差不多。
这里面有计时的问题,我用GetTickCount计时,这是受到tick精度影响的。
所以要首先把测量方法搞准。这个要不准的话,有个几百毫秒的差异都算是正常的。
13.x秒的三次是包括了new的,12.x秒的四次是提前new的(new的时间没算在内)。
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 13.094
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 13.250
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 13.266
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.593
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.531
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.672
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.484
.net 5和.net 6都把new提到intperf()的外面。前三次是.net 5的,后几次是.net 6的
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.84
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.88
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.80
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.98
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.91
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.75
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.72
--
修改:z16166 FROM 114.245.195.*
FROM 114.245.195.*
我觉得不应该优化他的代码。他的目的是对比运行效率。
如果要优化代码,那有两个很容易加速的:
内循环的边界测试it < cc没有必要。质数的平方肯定大于下一个质数。
内循环的j * j > i测试应该在循环外将i开方。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 标 题: Re: 出乎意料,C++和dotnet6比dotnet5慢10% (转载)
: 发信站: 水木社区 (Sun Dec 12 17:24:08 2021), 站内
:
: 下面这段代码试了一下,可以优化 20% 左右。
:
: #include <vector>
: #include <cmath>
: #include <iostream>
:
: using namespace std;
:
: int intperf()
: {
: constexpr int n = 5000 * 10000;
: bool found = false;
: vector<int> primes;
: primes.reserve(n);
: primes.push_back(2);
: primes.push_back(2);
: primes.push_back(2);
: primes.push_back(2);
: for (int i = 3; i <= n; i += 2) {
: int t = static_cast<int>(primes.size()) - 4;
: for (int it = 0; it <= t ; it += 4) {
: int j0 = primes[it + 0];
: int j1 = primes[it + 1];
: int j2 = primes[it + 2];
: int j3 = primes[it + 3];
: if ((i % j0 == 0) || (i % j1 == 0) || (i % j2 == 0) || (i % j3 == 0)) {
: found = true;
: break;
: }
: if (j0 * j0 > i) {
: break;
: }
: }
: if (!found) {
: primes[t + 1] = i;
: primes.push_back(2);
: } else {
: found = false;
: }
: }
: return primes.size() - 3;
: }
:
: int main()
: {
: cout << intperf() << endl;
: return 0;
: }
:
: 【 在 hgoldfish (老鱼) 的大作中提到: 】
: : 随便写的代码,cpp 还经常弱于 python 和 c# 呢。c# 和 python 底层用的都是优化过的 c 代码。
: : 我觉得 cpp 写代码的好处在于优化上限高,内存占用低。我优化一下这段代码看看。。
:
:
: --
: 灭绝人性啊
:
:
: ※ 修改:·hgoldfish 于 Dec 12 17:29:02 2021 修改本文·[FROM: 124.72.118.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 124.72.118.*]
--
修改:hgoldfish FROM 124.72.118.*
FROM 73.15.185.*
赞!
每次运行时间有波动,不过大体说明问题了
C#基本运算并不慢,但是框架基础类开销相对大,一层层积累下来差异就体现出来了
另外,dotnet 6比5慢没有想到
【 在 z16166 的大作中提到: 】
: 我这里测试,c++比.net 5的慢一点点,
: 但是c++把那个new提出来之后,比.net 5的要快一点点。
: 但是c++再把那个new放回原位后,跟.net 5的差不多。
: ....................
--
FROM 117.136.0.*
c#、c++都把new提到intperf()的外面,又跑了一下,c++的略快那么一点点
这个new操作如果需要的内存大,很可能会走VirtualAlloc()进入内核态,也就是有开销。
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.469 (GetTickCount64)
time: 12.473 (QueryPerformanceCounter)
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.406 (GetTickCount64)
time: 12.395 (QueryPerformanceCounter)
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.578 (GetTickCount64)
time: 12.574 (QueryPerformanceCounter)
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.438 (GetTickCount64)
time: 12.446 (QueryPerformanceCounter)
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.547 (GetTickCount64)
time: 12.541 (QueryPerformanceCounter)
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
time: 12.407 (GetTickCount64)
time: 12.409 (QueryPerformanceCounter)
//-------------------------------------------------------------------------
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.953 (Environment.TickCount)
12.943 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.844 (Environment.TickCount)
12.833 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.813 (Environment.TickCount)
12.810 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(134,5): warning NETSDK1182: 不支持在 Visual Studio 2019 中以 .NET 6.0 为目标。 [C:\temp\CsharpConsoleApp1\CsharpConsoleApp1\CsharpConsoleApp1.csproj]
12.843 (Environment.TickCount)
12.834 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.844 (Environment.TickCount)
12.851 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.766 (Environment.TickCount)
12.776 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.859 (Environment.TickCount)
12.850 (QueryPerformanceCounter)
C:\temp\CsharpConsoleApp1\CsharpConsoleApp1>dotnet run CsharpConsoleApp1.dll
12.781 (Environment.TickCount)
12.790 (QueryPerformanceCounter)
【 在 finlab 的大作中提到: 】
: 赞!
: 每次运行时间有波动,不过大体说明问题了
: C#基本运算并不慢,但是框架基础类开销相对大,一层层积累下来差异就体现出来了
: ...................
--
修改:z16166 FROM 114.245.195.*
FROM 114.245.195.*