小编cho*_*ger的帖子

迭代性能Java与C++

这个让我困惑了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)

c++ java performance

9
推荐指数
2
解决办法
649
查看次数

EME如何阻止我录制netflix流?

所以我们现在在自由软件浏览器中使用DRM,显然它运行得很好.然而,该视频仍然受到通常的合成影响.

我正在运行Fedora 25,包括wayland显示服务器.如果我确实正确理解了它的架构,它基本上希望应用程序将其内容呈现为缓冲区并排列复合的显示(例如,将几个窗口层叠在一起).为此,它必须能够访问这些缓冲区的内容.AFAIK wayland没有任何DRM.那么内容如何受到保护?

特别:

我为什么不能:

  • 使用虚拟pulseaudio设备录制声音
  • 使用自定义显示服务器记录图像

html encryption drm video-streaming wayland

7
推荐指数
1
解决办法
774
查看次数

为什么 zsh 会忽略 PATH 入口顺序?

我在这里尝试使用一个非常基本的设置模式:我有两个不同的给定工具安装(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)

shell command zsh resolution path

6
推荐指数
2
解决办法
1479
查看次数

Nativeint Bigarray似乎没有签名

我想将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 arrays int ocaml ffi

6
推荐指数
1
解决办法
125
查看次数

从clang格式样式中提取emacs c样式选项

一位同事为我提供了一个正在进行的C ++项目的clang格式样式文件。我安装了clang-format.el以便能够格式化emacs的缓冲区。重新格式化按预期工作。但是,Emacs的默认c模式缩进仍然完全不同。

我发现在编辑和以后恢复源代码时破坏源代码格式非常不安。有什么方法可以读取clang格式的文件并应用相应的cc-mode选项?

c++ emacs formatting clang clang-format

6
推荐指数
1
解决办法
1011
查看次数

跟踪(堆栈分配的)对象

在一个相当大的应用程序中,我想跟踪一些关于某个类的对象的统计信息.为了不降低性能,我希望在拉配置中更新统计数据.因此,我需要在某个位置引用每个活动对象.是否有惯用的方式:

  1. 创建,搜索,迭代此类引用
  2. 自动管理(即在销毁时删除参考)

我在这里考虑一组智能指针,但是内存管理会有些颠倒:当智能指针被销毁时,我不想破坏对象,当对象被销毁时我想要移除智能指针.理想情况下,我不想重新发明轮子.

我可以延迟删除指针,我只需要一种方法来快速使它们失效.

编辑:因为稻田要求它:基于拉动的收集的原因是获取信息可能相对昂贵.推动显然是一个干净的解决方案,但被认为太昂贵.

c++ pointers global reference

6
推荐指数
1
解决办法
135
查看次数

不稳定类型特征背后的原因是什么?

我今天正在调试一个失败的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++ standards types llvm

6
推荐指数
1
解决办法
172
查看次数

如何在C++/Ocaml之间安全地翻译树数据结构?

我有一个用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)

c++ ocaml garbage-collection ffi

6
推荐指数
1
解决办法
275
查看次数

OCaml 顶层多重依赖

当我有多个依赖项时,比如说

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

5
推荐指数
1
解决办法
432
查看次数

如何复制OCaml闭包?

我想存储一个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>

c closures ocaml

5
推荐指数
1
解决办法
297
查看次数