c++ - 有没有办法提高涉及 const 表达式的编译速度?
问题描述
我写了一个程序,列出所有小于 n 且至少有 3 个不同素数除数的数。这里是
#include <cstdio>
using namespace std;
const int N = 1e6;
int n;
char arr[N];
int main(){
for(int i = 2; i < N; i++) {
if(!arr[i])
for(int j = 2; i*j < N; j++)
arr[i*j]++;
}
scanf("%d", &n);
for(int i = 30; i < n; i++)
if(arr[i] >= 3)
printf("%d ", i);
printf("\n");
}
我注意到如果arr
在程序开始时准备好我可以显着提高它的速度所以我写了这个
#include <cstdio>
using namespace std;
template<int N>
struct A{
char arr[N];
constexpr A() : arr(){
for(int i = 2; i < N; i++) {
if(!arr[i])
for(int j = 2; i*j < N; j++)
arr[i*j]++;
}
}
};
int main(){
const int N = 1e6;
constexpr auto a = A<N>();
int n;
scanf("%d", &n);
for(int i = 30; i < n; i++)
if(a.arr[i] >= 3)
printf("%d ", i);
printf("\n");
}
程序变得更快,但编译第二个版本大约需要 30 秒。不过,执行第一个版本只需要不到一秒钟的时间。有没有办法优化 constexpression 以减少编译时间,最好是接近执行程序的第一个版本的时间
解决方案
推荐阅读
- jpa - 同一类上的两个 EntityGraph 不起作用(EclipseLink)
- hibernate - OneToMany 插入导致分离实体传递到持久错误
- dialogflow-es - 为什么 Dialogflow 在履行请求中将日期时间对象更改为日期格式?
- php - 无法通过 spatie/laravel-webhook-server 监听事件
- node.js - 上传 mernstack 应用程序时出现 Heroku 错误
- python - 更新 UserProfile 序列化程序时出现完整性错误
- c++ - 在链表尾部插入一个元素
- flutter - 如何将参数传递给颤振中的函数?
- apache-superset - 跳过超集标志页面
- browser - 本机浏览器放大缩小