C++程序如何利用所有内核
How to utilise all cores for C++ program
我运行将一个 Java 程序转换为 C++,与 Java 相比,我从 C++ 获得的性能非常慢。查看 activity 监视器,我看到我首先 运行 的 Java 程序使用了超过 90% 的 CPU,而 C++ 程序使用了大约30%.
看来 JVM 能够在没有用户干预的情况下利用 CPU 的全部功能。我应该做哪些更改才能更好地使用 C++ 案例的 CPU?
好好读一读C++ programming book then see this C++ reference. Read also the documentation of your C++ compiler (perhaps GCC).
还阅读一些 operating system textbook。
等框架
对于多核处理器,您可能会使用 C++ threads. You'll need to synchronize them, e.g. using mutex and condition variables。
在 GNU Linux 上,您可以阅读 advanced linux programming and use the syscalls(2) related to process creation and management (e..g. fork(2), execve(2), waitpid(2)...) and profiling (see time(7), profil(3), gprof(1), perf(1))。
在 Windows 上,您需要使用 WinAPI。
I translated a Java program into C++
总的来说,这是个坏主意。学习您的编程语言和操作系统,并为其设计软件。
从 现有的 开源软件中汲取灵感 github or gitlab (e.g. RefPerSys, Firefox, Tensorflow, OpenJDK, Clang static analyzer, Fish ...)
Java 实现(例如 JVMs) have some garbage collection and some class loader.
C++ 实现没有任何垃圾回收。所以阅读 GC handbook. Notice that circular references 很难在 C++ 中有效处理,这可以解释你的性能问题。
在 Linux/x86-64 上,您可能会加载 plugins with dlopen(3) with dlsym(3) (or generate machine code at runtime using asmjit or libgccjit)
我运行将一个 Java 程序转换为 C++,与 Java 相比,我从 C++ 获得的性能非常慢。查看 activity 监视器,我看到我首先 运行 的 Java 程序使用了超过 90% 的 CPU,而 C++ 程序使用了大约30%.
看来 JVM 能够在没有用户干预的情况下利用 CPU 的全部功能。我应该做哪些更改才能更好地使用 C++ 案例的 CPU?
好好读一读C++ programming book then see this C++ reference. Read also the documentation of your C++ compiler (perhaps GCC).
还阅读一些 operating system textbook。
等框架对于多核处理器,您可能会使用 C++ threads. You'll need to synchronize them, e.g. using mutex and condition variables。
在 GNU Linux 上,您可以阅读 advanced linux programming and use the syscalls(2) related to process creation and management (e..g. fork(2), execve(2), waitpid(2)...) and profiling (see time(7), profil(3), gprof(1), perf(1))。
在 Windows 上,您需要使用 WinAPI。
I translated a Java program into C++
总的来说,这是个坏主意。学习您的编程语言和操作系统,并为其设计软件。
从 现有的 开源软件中汲取灵感 github or gitlab (e.g. RefPerSys, Firefox, Tensorflow, OpenJDK, Clang static analyzer, Fish ...)
Java 实现(例如 JVMs) have some garbage collection and some class loader.
C++ 实现没有任何垃圾回收。所以阅读 GC handbook. Notice that circular references 很难在 C++ 中有效处理,这可以解释你的性能问题。
在 Linux/x86-64 上,您可能会加载 plugins with dlopen(3) with dlsym(3) (or generate machine code at runtime using asmjit or libgccjit)