publicclass Program
{
publicstaticvoid Main()
{
int count = (int)10 e6;
{
var watch = System.Diagnostics.Stopwatch.StartNew();
int sum = 0;
for (int i = 0; i < count; i++)
{
string st;
st = "12345678qwertyuioasdfgh";
sum += st[i % 23];
}
Console.WriteLine("Sum: {0}, Time: {1} ms", sum, watch.ElapsedMilliseconds);
}
{
var watch = System.Diagnostics.Stopwatch.StartNew();
int sum = 0;
string st;
for (int i = 0; i < count; i++)
{
st = "12345678qwertyuioasdfgh";
sum += st[i % 23];
}
Console.WriteLine("Sum: {0}, Time: {1} ms", sum, watch.ElapsedMilliseconds);
}
Console.ReadKey();
}
}
Команда Visual C++ рада сообщить, что в Visual Studio 2017 было существенно улучшено качество реализации модулей C++ согласно технической спецификации; также мы добавили возможность подключать Стандартную Библиотеку C++ через интерфейсы модулей. Эти интерфейсы, как и поддержка модулей компилятором, являются экспериментальной разработкой и будут...
时间=1018
总和=894782460
时间 = 371
总和=894782460
我不知道为什么,µl超过了它(还有更复杂的rand()变体)。
而对我来说,这很明显--把它从循环中拿出来。
是的,你是对的,我也在VS中试过,不知为什么,它根本没有优化,尽管这样一个简单的变体看起来......事实上,它归结为这样。
是的,你是对的,我也在VS中试过了--由于某些原因,它丝毫没有被优化,尽管这样一个简单的选项,看起来......从本质上讲,它归结为这样。
你确定你在项目 设置中启用了所有的优化吗?在奇怪的情况下,我打开装配清单的生成并查看它,它非常有指导意义。
为了好奇,我决定在C#中也测试一下。 结果不仅在速度上几乎一样,而且工作起来也比C++快得多。
结果。
Sum: 894782460, Time: 69 ms.
总和: 894782460, 时间: 56 ms
这里有一个C++中的类似物。
总和: 894782460, 时间: 2947 ms
总和: 894782460, 时间: 684 ms
我在VS 2019中测试,所有的优化都已启用 。
去他妈的这样的C++)。
p.s. 在C#中,不同的测试结果有令人愉快的差异,但平均而言,两种变体的速度相同。
你需要先了解刹车的原因。我做了一点调查,所有的东西都是内联的,除了调用
它位于libstdc++中。也就是说,在几乎赤裸裸的循环背景下,瓶颈是函数调用本身(也有几个来自...replaceEmmPKcm的调用)。编译器可以在一个翻译单元内进行优化。你可以尝试使用LTO(链接时间优化),即这允许在链接阶段进行优化。但我没有用过,现在也不会做。嗯,没有什么特别复杂的东西--传递给编译器/链接器-flto选项(但我有一些插件丢失了),懒得去弄清楚+可能要重建libstdc++。
与即将到来的模块拧在一起的代码优化将如何进行(从C++20开始)?我不知道,你可以在vs中尝试,尽管一切都很原始,而且是实验性的https://habr.com/en/company/pvs-studio/blog/328482/。
我们会想念C++'u的))。
出于兴趣,我决定也用C#进行测试,不仅在速度上结果几乎一样,而且工作速度也比C++快一个数量级。
结果。
总和: 894782460, 时间: 69 ms
总和: 894782460, 时间: 56 ms
这里有一个C++中的类似物。
Sum: 894782460, Time: 2947 ms.
总和: 894782460, 时间: 684 ms
我在VS 2019中测试,所有的优化都已启用 。
去他妈的这样的C++)。
p.s. C#的结果在不同的测试中波动很大,但平均而言,两种变体的速度相当。
擦--擦--擦--擦--擦,没门儿!夏普总是以二分之一的优势击败纯专业人员,你把项目 放出来吧。
小孩子 :)
他们把玩具拉长到10页...
在这里,我们应该首先理解缓慢的原因。我做了一点调查,除了调用之外,其他都是正常的。
它位于libstdc++中。
因此,它似乎已经发现每次都会分配和删除内存,即使是在这种情况下。
顺便说一下,我上次可能给出了错误的结果。 很可能是在x86模式下。现在我在x64模式下测试,C++的结果要好得多。
1) ~ 2000毫秒
2) ~ 200毫秒(它是3倍的速度)。
虽然我也把Studio更新到了最新的版本,但这肯定也影响了它,因为现在即使是x86也比以前的测试快。
好了,现在C++已经不那么可耻地落后于夏普了。 只差3倍左右 )
因此,它似乎已经发现每次都会分配和删除内存,即使是在这种情况下。
顺便说一下,我上次可能给出了错误的结果。 很可能是在x86模式下。现在我在x64模式下测试,C++的结果要好得多。
1) ~ 2000毫秒
2) ~ 200毫秒(它是3倍的速度)。
虽然我也把Studio更新到了最新版本,但肯定也影响了它,因为现在即使是x86也比以前的测试快。
所以,现在C++不那么可耻地输给了夏普。 只输了大约3倍 )
擦,擦,擦,擦,没门儿!夏普一直是两倍于清洁的pluses,你把项目放出来plz。
最好测试一下加号模块,那里的结果更有趣,尽管它们可能仍然没有记录。
我查了一下,原来没有https://en.cppreference.com/w/cpp/compiler_support 编译器完成模块,所以没有什么可看的。