我有一个大约 8GB 的大文本文件,我需要对其进行一些简单的过滤,然后对所有行进行排序。我在一台带有 SSD 和 128GB RAM 的 28 核机器上。我试过了
方法一
awk '...' myBigFile | sort --parallel = 56 > myBigFile.sorted
Run Code Online (Sandbox Code Playgroud)
方法二
awk '...' myBigFile > myBigFile.tmp
sort --parallel 56 myBigFile.tmp > myBigFile.sorted
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,方法 1 需要 11.5 分钟,而方法 2 只需要 (0.75 + 1 < 2) 分钟。为什么在管道传输时排序如此缓慢?不是并行的吗?
编辑
awk而myBigFile并不重要,这个实验是通过简单地使用可重复的seq 1 10000000 | sort --parallel 56(感谢@Sergei Kurenkov),我也观察到使用我的机器上取消管道版本六倍的速度提高。
最近了解了FNV哈希,出于纯粹的好奇,我就2166136261在Google上搜索了魔法常数。
我非常惊讶地发现FNV 哈希的维基百科页面显示为第三个搜索结果。然而,当我打开wiki页面时,我发现该常量2166136261没有出现在文章中(甚至没有出现在源代码中)。
Google 搜索怎么可能得到这个结果,或者它“知道”FNV 和 之间的关系吗2166136261?
编辑
\n\n为了确保搜索结果不会受到我的搜索历史的影响,我还在google.com.hk上尝试了隐身模式,Wiki结果仍然显示为第10个结果,而不是第3个。
\n\n而且它与第 1 到第 9 个结果有很大不同,因为它们大多数都是源代码,例如unsigned hash = 2166136261u ...
在这种情况下,我不确定 Google 是否看到 2166136261 和 Fowler\xe2\x80\x93Noll\xe2\x80\x93Vo 是“同义词”(或者它们在某种程度上相关),显然搜索“Fowler\xe2\x80\ x93Noll\xe2\x80\x93Vo" 将返回非常不同的结果。
\n我正在尝试exponential使用SIMD 计算函数。我发现了这个功能:https : //software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_exp_ps&expand=2136
我已经将其包含"immintrin.h"在代码中,并且我的cpu也有一个SSE标志。但是gcc在抱怨error: ‘_mm_exp_pd’ was not declared in this scope
如何检查SVML指令是否启用?
我有以下代码:
void foo(int64_t x) {}
void bar(int64_t* x) {}
int main() {
int32_t a = 3;
foo(a);
bar(&a);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译此,它给出了不能转换的错误int32_t*来int64_t*,这是我想要的.
我尝试调用时是否可能出现类似的错误foo(a)?
我在电脑上试过这个
std::cout << std::is_same<int64_t, long long>::value;
std::cout << std::is_same<int64_t, long>::value;
std::cout << sizeof(long);
std::cout << sizeof(long long);
std::cout << sizeof(int64_t);
Run Code Online (Sandbox Code Playgroud)
结果是 false, true, 8, 8, 8
我知道int64_t正好是64位,它显示的long是相同的int64_t,但long long不同于int64_t它,它也是64位.为什么会这样?
编辑
我可以在我的机器上使用long long和int64_t互换,因为它们都是整数类型且大小相同吗?
我的代码中有这个
for (int i=max_position; i<N; ++i) { ... }
但是,在循环内部我要更新它的值max_position,这会影响我的for循环吗?
我想在我的程序中显示一个进度条,所以我添加了这个
#include <stdio.h>
#include <unistd.h>
int main() {
puts("begin");
for (int i = 0; i < 100; i++) {
printf("%d%% finished.\r", i);
fflush(stdout);
usleep(100000);
}
puts("end");
}
Run Code Online (Sandbox Code Playgroud)
当它输出到stdout它时,显示一条指示当前进度的线.
但是,如果我将其输出定向到一个文件,那么所有的行都会printf("%d%% finished.\r", i);丢失.
是否可以将所有行保留在文件中?