这个让我困惑了3天.我有一个应用程序需要评估一组具有很少元素的整数多项式(多个args).我已经有一个用Java编写的实现,我目前正在移植到C++.
在测试期间,我注意到C++版本比Java版本慢了几个数量级.我当然知道JIT-ing,这种情况对于这种编译器特别适合,但我看到的远离我的预期.
示例代码如下所示,您需要提升以编译C++代码(但只需要简单的时间测量就可以使用该依赖关系).
choeger@daishi ~/uebb % clang++ -O3 -std=c++11 polytest.cpp -lboost_timer -lboost_system
choeger@daishi ~/uebb % ./a.out
0.011694s wall, 0.010000s user + 0.000000s system = 0.010000s CPU (85.5%)
Ideal Result: 1e+07
0.421986s wall, 0.420000s user + 0.000000s system = 0.420000s CPU (99.5%)
Result: 1e+07
choeger@daishi ~/uebb % javac PolyTest.java
choeger@daishi ~/uebb % java PolyTest
evals: 10000000 runtime: 17ms
Ideal Result: 1.0E7
evals: 10000000 runtime: 78ms
Result: 1.0E7
Run Code Online (Sandbox Code Playgroud)
显然,C++版本(使用clang-3.3编译)在纯计算能力方面运行得稍微快一点,但Java(openjdk 1.7.0.60)在解释多项式时表现更好.到目前为止,我的猜测是,由于迭代过小(在样本1元素中)向量,我的C++代码不是很理想.我认为当涉及到缓存命中未命中时,JVM在这方面做得更好.
有没有办法让我的C++版本表现更好?我有没有看到不同的原因?并且作为旁注:有没有办法测量C++和Java进程的缓存一致性?
C++代码如下所示:
#include <boost/timer/timer.hpp>
#include <iostream>
#include <vector>
using namespace std;
struct …
Run Code Online (Sandbox Code Playgroud) 所以我们现在在自由软件浏览器中使用DRM,显然它运行得很好.然而,该视频仍然受到通常的合成影响.
我正在运行Fedora 25,包括wayland显示服务器.如果我确实正确理解了它的架构,它基本上希望应用程序将其内容呈现为缓冲区并排列复合的显示(例如,将几个窗口层叠在一起).为此,它必须能够访问这些缓冲区的内容.AFAIK wayland没有任何DRM.那么内容如何受到保护?
特别:
我为什么不能:
我在这里尝试使用一个非常基本的设置模式:我有两个不同的给定工具安装(ocamlc,但这并不重要)。为了选择一个工具,我尝试通过添加一个条目来覆盖 PATH 变量。
% where ocamlc
/home/choeger/ueb/uebb/amsun-integration/Runtime/test_src/../../opam/4.02.3/bin/ocamlc
/home/choeger/.opam/4.02.3/bin/ocamlc
/usr/bin/ocamlc
Run Code Online (Sandbox Code Playgroud)
但是,zsh 仍然使用旧条目:
% ocamlc -v
The OCaml compiler, version 4.02.3
Standard library directory: /home/choeger/.opam/4.02.3/lib/ocaml
Run Code Online (Sandbox Code Playgroud)
(可以看到它使用了第二个条目,因为库目录是硬编码到该安装的)
Bash 的行为符合预期:
% bash -c "ocamlc -v"
The OCaml compiler, version 4.02.3
Standard library directory: /home/choeger/ueb/uebb/amsun-integration/opam/4.02.3/lib/ocaml
Run Code Online (Sandbox Code Playgroud)
那么为什么 zsh 忽略第一个 PATH 条目,尽管它将它列为的第一个元素where
?
编辑:为了验证 zsh 没有调用相同的二进制文件,这里是另一个运行:
% type -a ocamlc
ocamlc is /home/choeger/ueb/uebb/amsun-integration/tests/pendulum/../../opam/4.02.3/bin/ocamlc
ocamlc is /home/choeger/.opam/4.02.3/bin/ocamlc
ocamlc is /usr/bin/ocamlc
% ocamlc -v
The OCaml compiler, version 4.02.3
Standard library directory: /home/choeger/.opam/4.02.3/lib/ocaml
% /home/choeger/ueb/uebb/amsun-integration/tests/pendulum/../../opam/4.02.3/bin/ocamlc -v
The OCaml …
Run Code Online (Sandbox Code Playgroud) 我想将int-arrays从C库返回到OCaml程序.为了做到这一点,我想我只是将它们包装成一个Bigarray.Array1.t
.下面是C-stub的一个小演示:
/* nativeintarray.c */
#include <stdio.h>
#include <assert.h>
#include <caml/memory.h>
#include <caml/bigarray.h>
CAMLprim value make_array(value unit) {
CAMLparam1(unit);
int* a = calloc (1, sizeof(int));
a[0] = -1;
/* Create a C-style bigarray, yes it is a memory leak */
CAMLreturn(caml_ba_alloc_dims(CAML_BA_NATIVE_INT | CAML_BA_C_LAYOUT, 1, a, 1));
}
Run Code Online (Sandbox Code Playgroud)
我的示例程序如下所示:
(* nativeintarray.ml *)
open Bigarray
(** Type for int arrays from/to C *)
type ivector = (nativeint, nativeint_elt, c_layout) Array1.t
external make_array : unit -> ivector = "make_array"
let () = …
Run Code Online (Sandbox Code Playgroud) 一位同事为我提供了一个正在进行的C ++项目的clang格式样式文件。我安装了clang-format.el以便能够格式化emacs的缓冲区。重新格式化按预期工作。但是,Emacs的默认c模式缩进仍然完全不同。
我发现在编辑和以后恢复源代码时破坏源代码格式非常不安。有什么方法可以读取clang格式的文件并应用相应的cc-mode选项?
在一个相当大的应用程序中,我想跟踪一些关于某个类的对象的统计信息.为了不降低性能,我希望在拉配置中更新统计数据.因此,我需要在某个位置引用每个活动对象.是否有惯用的方式:
我在这里考虑一组智能指针,但是内存管理会有些颠倒:当智能指针被销毁时,我不想破坏对象,当对象被销毁时我想要移除智能指针.理想情况下,我不想重新发明轮子.
我可以延迟删除指针,我只需要一种方法来快速使它们失效.
编辑:因为稻田要求它:基于拉动的收集的原因是获取信息可能相对昂贵.推动显然是一个干净的解决方案,但被认为太昂贵.
我今天正在调试一个失败的clang构建.那个构建基本上破了,因为is_default_constructible
评估为false
.经过几个小时的平分问题后,我将问题减少到最小的情况:
#include <type_traits>
#include <string>
namespace A {
// This has been extracted from an old (outdated(?))
// implementation of an optional type
struct empty_t {};
template<class T>
struct o
{
public:
template<class... U,
typename std::enable_if<
std::is_constructible<T, U...>::value,
bool
>::type = false
>
o(empty_t, U&&... u) { }
};
}
struct B
{
struct Foo
{
//Foo () {}; // uncomment this line and it works
bool x = true; // comment this line and it …
Run Code Online (Sandbox Code Playgroud) 我有一个用C++编写的遗留数据结构和OCaml中的一个新工具,该工具有望处理这些遗留数据.所以我需要将前者的数据导入/转换为后者.数据采用树形式,通常由访问者处理.
作为一个简单的例子考虑这个最小的DSL:
#include <memory>
using namespace std;
class intnode;
class addnode;
struct visitor {
virtual void visit(const intnode& n) = 0;
virtual void visit(const addnode& n) = 0;
};
struct node {
virtual void accept(visitor& v) = 0;
};
struct intnode : public node {
int x;
virtual void accept(visitor& v) { v.visit(*this); }
};
struct addnode : public node {
shared_ptr<node> l;
shared_ptr<node> r;
virtual void accept(visitor& v) { v.visit(*this); }
};
Run Code Online (Sandbox Code Playgroud)
它在OCaml中的表示如下所示:
type node = Int of int …
Run Code Online (Sandbox Code Playgroud) 当我有多个依赖项时,比如说
module A = struct
open B
...
end
module B = struct
...
end
Run Code Online (Sandbox Code Playgroud)
是否可以让 OCaml toplevel/utop 加载具有所有依赖项的 A.ml(即#use "./A.ml"
自动加载 B.ml)?
我想存储一个OCaml闭包供以后由外部C库使用.我能够做到以下几点:
<TARGET> = caml_alloc(Wosize_val(<SOURCE>), Tag_val(<SOURCE>));
caml_register_global_root(<TARGET>);
Code_val(<TARGET>) = Code_val(<SOURCE>);
Run Code Online (Sandbox Code Playgroud)
但正如名称"封闭"所暗示的那样,仅仅复制代码位置是不够的.
如何制作(垃圾收集器友好)副本<SOURCE>
?