C ++:与每次内联它相比,对输入验证函数进行编程会带来多少性能影响?

时间:2019-05-08 22:57:38

标签: c++ performance validation

也许是一个简单的问题,但是如果我要编写大量的代码来让用户不断输入数据,并且不断验证数据,那么将输入验证委派给用户是否有效率方面的优势或劣势?具体功能?显然,要更好地了解和理解,但是我说的是严格的优化。

例如,如果用户输入一个int,则可以很容易地做到这一点。但是,如果他们也输入浮点数或双精度数怎么办?将其拆分为三个不同的验证功能,甚至为所有三个功能模板化一个功能,还是有利的?还是差异可能是如此之小,以至于根本没有关系?

作为一个例子,这是最简单的整数验证。在我当前的项目中,它已经使用了大约四次,但在其他地方,我使用它的时间超过了十次。

    bool loopFlag = true;
    int choice = 0;

    do
    {
        std::cin >> choice;
        if (std::cin.fail() || restChoice > NUMHFCS || restChoice <= 0)
        {
            std::cout << "Invalid choice. Number must be between 1 and 8." 
            << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        }
        else
        {
            loopFlag = false;
        }
    }
    while (loopFlag);

1 个答案:

答案 0 :(得分:4)

请勿尝试自己内联。性能优势微不足道。您可能会得到更差的性能:您将获得更大的二进制文件,这意味着CPU加载代码时会有更多的缓存丢失。

原因1:编译器最了解。这是一个方便的经验法则:如果函数值得内联,则编译器会对其进行内联。大于或等于函数没关系。如果内联函数只能使它快0.05%,为什么要内联呢?

原因2:不内联大函数可以使代码更快。这似乎有点违反直觉,但是请考虑一下:程序越小,最适合的可能性就越大。 -CPU缓存中使用的零件。对于大型程序,在运行之前将代码加载到缓存中可能会使速度变慢。通过将内容打包到函数中,可以使生成的机器代码更小,因此更有可能适合缓存。

原因3:加速可以忽略不计。您提供的示例代码相对昂贵。输入/输出操作通常非常昂贵,并且std::istream&使用许多虚拟函数(调用它们本身相对昂贵)。最慢的部分? 您要从人工输入。(从字面上看)向人工输入要比进行函数调用慢十亿倍。

原因4:如果您手动内联内容,则修复错误的难度会大大增加。假设您在其中一个验证功能中发现了一个错误。如果您将其编写为函数,则很容易修复:更改函数即可完成。但是,如果您内联代码,则对其进行修复将变得更加困难。您必须找到使用该验证代码的所有位置,并在每个部分中分别进行修复。