小编scr*_*cry的帖子

C程序比Python子进程更快

我在C中有一个多线程mergesorting程序,以及一个用0,1,2或4个线程进行基准测试的程序.我还用Python编写了一个程序来进行多项测试并汇总结果.

奇怪的是,当我运行Python时,测试总是在大约一半的时间内运行,而不是直接在shell中运行它们.

例如,当我用400万个整数运行测试程序进行排序时(最后两个参数是生成整数的种子和模数):

$ ./mergetest 4000000 4194819 140810581084
0 threads:  1.483485s wall;  1.476092s user;  0.004001s sys
1 threads:  1.489206s wall;  1.488093s user;  0.000000s sys
2 threads:  0.854119s wall;  1.608100s user;  0.008000s sys
4 threads:  0.673286s wall;  2.224139s user;  0.024002s sys
Run Code Online (Sandbox Code Playgroud)

使用python脚本:

$ ./mergedata.py 1 4000000
Average runtime for 1 runs with 4000000 items each:
0 threads:   0.677512s wall;   0.664041s user;   0.016001s sys
1 threads:   0.709118s wall;   0.704044s user;   0.004001s sys
2 threads:   0.414058s wall;   0.752047s user;   0.028001s sys
4 threads: …
Run Code Online (Sandbox Code Playgroud)

c python benchmarking subprocess

11
推荐指数
1
解决办法
438
查看次数

Ocaml的命名参数

试图了解Ocaml的命名参数机制.我理解基础知识,但文档显示了这样的示例:

# let f ~x ~y = x - y;;
val f : x:int -> y:int -> int = <fun>

# let x = 3 and y = 2 in f ~x ~y;;
- : int = 1
Run Code Online (Sandbox Code Playgroud)

在应用中仅使用波浪号时究竟发生了什么?它只是简写~x:x,类似于定义吗?如果是这样,有人可以解释为什么这样:

# ListLabels.fold_left;;
- : f:('a -> 'b -> 'a) -> init:'a -> 'b list -> 'a = <fun>

# let add = (+) and i = 0 
in ListLabels.fold_left ~add ~i [1;2;3];;
Run Code Online (Sandbox Code Playgroud)

产生

- : f:((add:(int -> …
Run Code Online (Sandbox Code Playgroud)

ocaml currying named-parameters

9
推荐指数
1
解决办法
842
查看次数

过滤参数包的类型

我想知道是否可以过滤传递给可变参数模板的类型(基于谓词模板)来生成包含满足谓词的那些类型的另一个可变参数模板:

/** Filter a parameter pack */    
template <template <class> class,
          template <class...> class,
          class...>
struct filter;
template <template <class> class Pred, template <class...> class Variadic>
struct filter<Pred, Variadic> : Variadic<>
{};
template <template <class> class Pred,
          template <class...> class Variadic,
          class T, class... Ts>
struct filter<Pred, Variadic, T, Ts...>
{
    // FIXME: this just stops at first T where Pred<T> is true
    using type = typename std::conditional<
        Pred<T>::value,
        Variadic<T, Ts...>,    // can't do: Variadic<T, filter<...>>
        filter<Pred, Variadic, Ts...> >::type; …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming variadic-templates c++11

8
推荐指数
1
解决办法
2249
查看次数

图阿雷格模式和凸轮模式

我目前正在使用tuareg模式,但我希望能够使用caml-mode的功能.特别是我希望能够以交互方式使用类型注释,并且显然这与caml类型一起发生.我尝试将http://cristal.inria.fr/~remy/poly/emacs/index.html放在我的.emacs.d中,但我对这两种模式如何或如何协同工作感到困惑.事实上,我根本无法使用caml-mode工作.

我在init.el中有这一行:

(add-to-list 'load-path "~/.emacs.d/modes/caml")
Run Code Online (Sandbox Code Playgroud)

但是文件没有加载 - 至少没有函数定义或键绑定.我真的以为我开始意识到这些emacs插件是如何工作的,但我开始怀疑.也许有人可以解释还有什么需要发生?

编辑:我没有意识到我必须require 'caml为此工作.尽管我有来自http://caml.inria.fr/svn/ocaml/branches/gadts/emacs/的 caml-types,但注释似乎并没有起作用.我编译-annot但我仍然被告知没有注释文件.

emacs ocaml annotations tuareg

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

捕获参考的常数

可以通过可变引用捕获对象,并在成员函数内部进行更改,该成员函数采用相同的对象const.

void g(const int& x, std::function<void()> f)
{
  std::cout << x << '\n';
  f();
  std::cout << x << '\n';
}

int main()
{
  int y = 0;
  auto f = [&y] { ++y; };
  g(y, f);
}
Run Code Online (Sandbox Code Playgroud)

对象在其所在的范围内发生变异const.据我所知,编译器不能在这里执行常量性不证明xy是别名.我想我正在寻找的是确认这是未定义的行为.在某种意义上它是否等同于const_cast- const在一个应该存在的上下文中使用非值?

const c++11

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

OCaml中的尾调用转换

我在课堂上被告知,由于在递归调用之后计算了布尔运算符,因此以下函数不是尾递归的:

let rec exists p = function
    [] -> false
  | a::l -> p a || exists p l
Run Code Online (Sandbox Code Playgroud)

但是这并没有将堆栈放在1000万大小的列表中,更重要的是,它是标准库中的实现.如果它不是尾递归,则没有理由使用这种形式而不是看似等效且明确的尾递归

let rec exists p = function
    [] -> false
  | a::l -> if p a then true else exists p l
Run Code Online (Sandbox Code Playgroud)

所以看起来OCaml编译器能够在这样的简单情况下优化布尔运算,以利用尾递归.但是我注意到如果我像这样切换操作数的顺序

let rec exists p = function
    [] -> false
  | a::l -> exists p l || p a
Run Code Online (Sandbox Code Playgroud)

然后堆栈确实在10米元素上爆炸.因此,当递归调用出现在右侧时,OCaml似乎只能利用这一点,这让我怀疑所有编译器都会用等效if表达式替换boolean op .有人可以确认或反驳这个吗?

ocaml tail-recursion tail-call-optimization

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

R:具有列特定功能的聚合

我想按时间间隔聚合数据帧,对每列应用不同的函数.我想我几乎已经aggregate失败了,并且已将我的数据分成与chron包装的间隔,这很容易.

但我不知道如何处理子集.所有的地图功能,*apply,*ply,采取一种功能(我希望的东西,拿了功能的载体每列或-variable申请,但还没有找到一个),所以我在写一个函数,我的数据框架子集,并给出所有变量的均值,除了"时间",它是索引,"径流"应该是总和.

我试过这个:

aggregate(d., list(Time=trunc(d.$time, "00:10:00")), function (dat) with(dat, 
list(Time=time[1], mean(Port.1), mean(Port.1.1), mean(Port.2), mean(Port.2.1), 
mean(Port.3), mean(Port.3.1), mean(Port.4), mean(Port.4.1), Runoff=sum(Port.5))))
Run Code Online (Sandbox Code Playgroud)

即使它没有给我这个错误,这将是丑陋的:

Error in eval(substitute(expr), data, enclos = parent.frame()) : 
  not that many frames on the stack
Run Code Online (Sandbox Code Playgroud)

这告诉我,我真的做错了什么.从我看到的RI看来,必须有一种优雅的方式来做到这一点,但它是什么?

dput:

d. <- structure(list(time = structure(c(15030.5520833333, 15030.5555555556, 
15030.5590277778, 15030.5625, 15030.5659722222), format = structure(c("m/d/y", 
"h:m:s"), .Names = c("dates", "times")), origin = structure(c(1, 
1, 1970), .Names = c("month", "day", "year")), class = c("chron", 
"dates", "times")), Port.1 = c(0.359747, …
Run Code Online (Sandbox Code Playgroud)

aggregate r

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

有没有C++轻量级跨平台文件系统库?

我需要一个轻量级的跨平台文件系统库来进行游戏开发.我想在Windows,Linux和Mac上发布我的游戏.

据我所知,使用dirent.h可以在所有三个平台上运行.但是,我想知道是否存在一个更易于使用的库 - 使用直接替换对我来说很困惑而且我没有得到任何结果.

我也尝试过Boost,但我不喜欢它不是轻量级的事实,它让我在游戏的Unix端口上遇到了麻烦.

我需要的功能是:

  • 递归读取目录树
  • 获取目录中的所有文件
  • 获取目录中的所有子目录

c++ filesystems api dll

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

D中的结构参数推导

只是想知道为什么这不编译.我以为编译器可以推断参数化结构的类型?

void main() {
    auto arr = Arr([1,2,3]);
}

struct Arr(T) {
    private T[] data;
}
Run Code Online (Sandbox Code Playgroud)

错误:

junk.d(25): Error: struct junk.Arr(T) is not a function template
junk.d(25): Error: struct junk.Arr(T) cannot deduce template function from argument types !()(int[])
Run Code Online (Sandbox Code Playgroud)

templates type-inference d

3
推荐指数
1
解决办法
156
查看次数

stringstream::str 复制生命周期

很多 C++ 程序员在第一次使用stringstreams 时会错过(读:我)这样一个事实,即返回的副本stringstream::str()是临时的,它会持续到它所使用的表达式结束为止。但是,我不明白:

  1. 这是如何完成的。查看sstreamlibstdc++ 的标头,我只看到正在制作并返回一个副本。寿命是如何限制的?
  2. 为什么这是理想的行为,特别是因为这是一个如此常见的问题。如果无论如何都会制作副本,为什么我不能拥有它的所有权?

请注意,这不是stringstream、string 和 char* 转换混淆的重复。这超出了对行为和解决方法的解释;我正在寻找机制和原理。

c++ memory stringstream

3
推荐指数
1
解决办法
1385
查看次数