小编Kir*_*how的帖子

简单的方法调用真的很慢?

编辑:我已经解决了我的问题.原因是测试程序出错,一旦我被允许回答我自己的问题,就会详细说明.

我知道通常应该避免这类问题,但我遇到了一个我无法理解的奇怪情况.我一直在尝试实现PRNG,我一直在测试它对System.Random的性能.我发现我的代码慢了~50倍,但问题不是算法,而只是调用方法.即使我刚刚返回一个常量,它仍然会慢很多倍.

所以我写了一个简单的测试程序,它比较调用一个包装random.NextDouble()的方法,一个返回-1的方法,并直接调用random.NextDouble().我在Ideone中运行了测试,它给出了预期的结果 ; 所有时间都相似,并且返回常数最快.时间都在0.1秒左右.

但是,在Visual Studio 2011 Beta或2010 C#Express中编译的相同代码将分别为每种情况产生4秒,4秒和0.1秒.我肯定在发布模式下运行,勾选了优化代码复选框,从Visual Studio外部启动会产生相同的结果.那么为什么这样简单的方法在Visual Studio中调用比Ideone慢得多?这是我用来进行基准测试的代码:

using System;
using System.Diagnostics;

public class Test{
    static Random random = new Random();

    public static Double Random() {
        return random.NextDouble();
    }

    public static Double Random2() {
        return -1;
    }

    public static void Main() {
        {
            Stopwatch s = new Stopwatch();
            Double a = 0;
            s.Start();
            for (Int32 i = 0; i < 5000000; i++)
                a += Random();
            s.Stop();
            Console.WriteLine(s.ElapsedMilliseconds);
        }

        {
            Stopwatch s = new Stopwatch(); …
Run Code Online (Sandbox Code Playgroud)

c# performance prng

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

如何尝试读取为int,然后如果它失败读取为字符串?

我试图重复读取整数,以及非整数的标记,以读取和处理它们作为字符串.我认为以下内容可行:

string s;
int x;

while(1) {
    if (cin >> x)                                     // try reading as int
        cout << "read int: " << x << endl;
    else {                                            // try reading as string
        cin.clear();

        if (cin >> s) 
            cout << "read string: " << s << endl;
        else
            break;                                    // eof
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,对于输入(在换行时使用换行符)

1 2 a
Run Code Online (Sandbox Code Playgroud)

它给出了输出

read int: 1
read int: 2
Run Code Online (Sandbox Code Playgroud)

似乎清除流的状态与之前不完全相同,实际上cin >> s失败了.为什么会这样,我怎样才能实现我想要的行为?

为了澄清,我无法将字符串解析为int,因为我尚未"学习"它.

c++ cin

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

标签 统计

c# ×1

c++ ×1

cin ×1

performance ×1

prng ×1