我在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) 试图了解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) 我想知道是否可以过滤传递给可变参数模板的类型(基于谓词模板)来生成包含满足谓词的那些类型的另一个可变参数模板:
/** 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) 我目前正在使用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但我仍然被告知没有注释文件.
可以通过可变引用捕获对象,并在成员函数内部进行更改,该成员函数采用相同的对象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.据我所知,编译器不能在这里执行常量性不证明x和y是别名.我想我正在寻找的是确认这是未定义的行为.在某种意义上它是否等同于const_cast- const在一个应该存在的上下文中使用非值?
我在课堂上被告知,由于在递归调用之后计算了布尔运算符,因此以下函数不是尾递归的:
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 .有人可以确认或反驳这个吗?
我想按时间间隔聚合数据帧,对每列应用不同的函数.我想我几乎已经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) 我需要一个轻量级的跨平台文件系统库来进行游戏开发.我想在Windows,Linux和Mac上发布我的游戏.
据我所知,使用dirent.h可以在所有三个平台上运行.但是,我想知道是否存在一个更易于使用的库 - 使用直接替换对我来说很困惑而且我没有得到任何结果.
我也尝试过Boost,但我不喜欢它不是轻量级的事实,它让我在游戏的Unix端口上遇到了麻烦.
我需要的功能是:
只是想知道为什么这不编译.我以为编译器可以推断参数化结构的类型?
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) 很多 C++ 程序员在第一次使用stringstreams 时会错过(读:我)这样一个事实,即返回的副本stringstream::str()是临时的,它会持续到它所使用的表达式结束为止。但是,我不明白:
sstreamlibstdc++ 的标头,我只看到正在制作并返回一个副本。寿命是如何限制的?请注意,这不是stringstream、string 和 char* 转换混淆的重复。这超出了对行为和解决方法的解释;我正在寻找机制和原理。
c++ ×3
ocaml ×3
c++11 ×2
aggregate ×1
annotations ×1
api ×1
benchmarking ×1
c ×1
const ×1
currying ×1
d ×1
dll ×1
emacs ×1
filesystems ×1
memory ×1
python ×1
r ×1
stringstream ×1
subprocess ×1
templates ×1
tuareg ×1