问题标签 [compilation-time]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
309 浏览

c++ - c1xx.dll 和 c2.dll 在 Visual Studio 编译过程中的“职责”是什么?

我正在尝试分析我的工作中编译时间长的原因(Visual Studio 2017、许多 C++ 和一些 C++/CLI 项目),所以我打开了 /Bt+ 标志并获得了关于多少时间的详细输出c1xx 和 c2 在每个文件中花费。我不确定他们每个人负责什么,所以如果有人能详细说明,我会很高兴。

提前致谢

0 投票
1 回答
82 浏览

c++ - dllexport 类模板实例(专业化),减少仅头文件模板库的编译时间

是否可以导出一些类模板实例,同时让库的用户能够生成给定类模板的其他特化(编译可执行文件时)。

鉴于我有一个公共标头

通过这种声明类模板的方式,Foo每个实例化都将发生在用户的可执行文件中。

但是,如果我定义Foodllexport/dllimport使用API宏,则其每个Foo特化都没有在 dll 中显式实例化,将无法链接。

那么,是否可以强制编译器在导出一个类模板实例时链接到现有的类模板实例,并生成另一个没有的类模板实例。

更新

我找到了解决方案,请参阅下面的答案。我留下旧的更新,以防有人会发现 SFINAE 的这种用法有帮助。


更新旧

我发现了一个涉及 SFINAE 的繁琐解决方案,但它导致定义一个类模板两次,因此非常容易出错。我不知道它是否可以用宏包裹起来,这样就可以只写一次。

0 投票
0 回答
1701 浏览

c++ - 如何使用 clang 更快地编译?

我有一个 Visual Studio 2019 C++ 项目,我正在将其转换为 clang,我注意到,正如-ftime-reportswitch 所报告的那样,clang 版本的编译速度要慢一些,平均来说,clang 需要大约 1700 毫秒来编译,而 VS2019 版本只需要 1150 毫秒编译。不涉及预编译头文件。

clang++.exe请注意,我通过直接使用以下(最相关的)标志直接从命令行调用来构建 clang 版本:

VS2019 版本使用以下标志:

是什么导致 VS2019 速度如此之大?MsBuild 是否做了一些特别的事情来加速我对 clang 编译器的简单命令行调用没有做的编译?

0 投票
0 回答
235 浏览

c++ - 使用 C++ 仅头文件库时减少二进制文件大小和编译时间

我正在使用 tiny-dnn C++ 库作为基础创建一个 GDScript 包装器库。

问题是 tiny-dnn 只是标题,我必须将它包含在我的库的大部分 .cpp 文件中(毕竟,我正在创建一个包装器)。这导致编译时间为 1 分钟/文件和大约 300MB 的二进制文件。

作为“解决方案”,我决定将所有代码(20 个 .cpp 文件)放入一个大文件中,并且只包含一次 tiny-dnn。编译时间保持不变,但现在我只有一个文件,二进制大小减少到 ~50MB。根据这个实验,我猜在我包含它的时候,tiny-dnn 会被一遍又一遍地复制。

我可以使用上面的“解决方案”继续我的项目,但我仍然在质疑:有没有办法保持减少的二进制大小和减少的编译时间,仍然有单独的文件并且仍然使用 tiny-dnn?

顺便说一句,我正在使用 Linux 并使用 g++ 以及 SCons 进行编译。

0 投票
3 回答
44 浏览

java - Java - 创建一个没有枚举的 Card 对象,并进行编译时类型检查

我想创建一个可以为我提供卡片的课程,即

我希望班级在编译期间检查卡片的类型是否为黑桃、红心、钻石或梅花,如果不是 - 它会引发错误并且不会让我编译。该类不应使用枚举

编辑:问这个问题的目的仅仅是为了了解在预枚举时代人们将如何回答这类问题。几年前的一次求职面试中,我被问到了这个问题

0 投票
0 回答
533 浏览

rust - 如何通过拆分我的项目来加快 Rust 编译时间

我有一个大约 5k 行的 Rust 项目和大约 15 个依赖项。编译这个需要很长时间,所以我过去常常cargo -Z timings看看是什么导致了瓶颈。基本上,与 jsonrpc 相关的包似乎会增加很多编译时间,但我只是在一个函数中使用 jsonrpc,所以我不明白为什么我的整个项目需要等待 jsonrpc 编译。

有没有办法重新组织我的项目,以便项目的其余部分可以与 jsonrpc 并行编译,然后最终的 jsonrpc 部分可以在最后编译?

现在,我的项目是这样组织的:

0 投票
2 回答
75 浏览

c++ - const数组的C++长编译时间

我正在使用 C++ 组件在 Node.js 中制作游戏。这个 C++ 组件经常被调用(作为一个子进程)并且是一个瓶颈。因此,我将其资产硬编码为 const 数组以使其运行得更快。

但是,我注意到我的 C++ 代码需要很长时间才能编译。以下是问题的演示:

如果将中间段落重复 80 次,它的大小将与我的 C++ 程序相当。我用g++ test.cpp -O3它编译,编译需要 36 秒。我不明白为什么这么慢。有什么我可以改变的,让它编译得更快吗?

0 投票
1 回答
462 浏览

c++ - 构建分析:CMake/ninja 可以为每个编译单元生成编译时间日志吗?

我正在尝试分析我的项目的构建时间,以便我可以看到花费最多的时间。这似乎应该很容易......如果我将每个clang命令都列在一个文件中,我可以对每个命令进行计时并按时间排序以找到耗时最长的编译,然后我可以进去看看哪些编译单位令人惊讶,并试图弄清楚为什么他们这么慢。

谷歌搜索让我无处可去。显然,这是可能的,而且很有用。

所以,要么:

  • 基本上这样做的选择是什么?

或者

  • 如何让 CMake/ninja 转储出clang它想要运行的所有命令的列表?
  • 或者,也许这样做的方法是编写一个脚本来记录命令和它所花费的时间并将其用作CXX_COMPILER_LAUNCHER?
0 投票
1 回答
75 浏览

c# - C# - 检查泛型类型约束中的编译级别参数| ... 其中 T : new( Foo a )

泛型类型中众所周知的约束是 new(),可以添加 (args,args,...) 之类的参数来强制编译器检查该类是否包含特定的构造函数?

该块向您展示了这种情况。

这是指令显示可能的语法异常, new(int arg1)

通用实例调用构造函数的方式并不重要,因为基本反射在运行时解决了问题,但想法是强制编译器错误。


ATTEMPT#1 - 这是不可能的;因为接口不能指定构造函数。

ATTEMPT#2 - 原始问题已关闭,因为版主专注于在运行时级别而不是编译时级别解决问题。

这个问题在这个问题中没有重复:因为(T)Activator.CreateInstance( typeof(T) , args ) 在您需要非常严格的编译检查时不是一个选项。很明显,Activator 没有完成基本原则(必须尽可能使用派生类和继承行为,而不是它们的最终实现 - Liskov),即保证类型即使在编译级别也具有父类型的行为。