这是以下代码

Sieve.c

/* -*- mode: c -*-
 * $Id$
 * http://www.bagley.org/~doug/shootout/
 */

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[]) {
#ifdef SMALL_PROBLEM_SIZE
#define LENGTH 17000
#else
#define LENGTH 170000
#endif
    int NUM = ((argc == 2) ? atoi(argv[1]) : LENGTH);
    static char flags[8192 + 1];
    long i, k;
    int count = 0;

    while (NUM--) {
    count = 0; 
    for (i=2; i <= 8192; i++) {
        flags[i] = 1;
    }
    for (i=2; i <= 8192; i++) {
        if (flags[i]) {
                /* remove all multiples of prime: i */
        for (k=i+i; k <= 8192; k+=i) {
            flags[k] = 0;
        }
        count++;
        }
    }
    }
    printf("Count: %d\n", count);
    return(0);
}

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(sieve)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
add_executable(sieve   "Sieve.c")

由CMakeLists.txt构建 结果:

time ./sieve
Count: 1028

real    0m15.436s
user    0m15.431s
sys     0m0.000s

command: gcc Sieve.c -O3 -o sieve

结果:

time ./sieve
Count: 1028

real    0m3.087s
user    0m3.086s
sys     0m0.000s

为什么会有如此显著的差异?如果有人能给我一个答案,我将不胜感激.

CPU:英特尔(R)至强(R)白金8255C CPU@2.50 GHz

操作系统:ubuntu22.04 LTS

推荐答案

您没有在您的CMakeLists.txt中正确启用优化.

这条线

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")

在编译C++ files时将传递给g++的参数相加-O3.但是sieve.c是一个C文件,而不是C++文件.

您需要设置CMAKE_C_FLAGS(注意:C,而不是CXX)来控制编译C文件时传递给gcc的参数:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")

C++相关问答推荐

C限制限定符是否可以通过指针传递?

C中出现分段错误后关闭文件

不同到达时间的轮询实现

如何使用Python C API实现多线程程序?

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

使用NameSurname扫描到两个单独的字符串

识别和处理c中整数溢出的最佳方法?

struct -未知大小

限制不同类型的限定符

在C++中访问双指针

为什么此共享库没有预期的依赖项?

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

如何将另一个数组添加到集合中,特别是字符串?

如何在C-函数中混合使用C代码和ASM?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

-Wnonnull-Compare警告不是具有误导性吗?

在C程序中使用Beaglebone Black UART的问题

C中的char**v*char[]

try 判断长整数是否为素数

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?