小编bbv*_*van的帖子

为什么使用管道进行排序(linux 命令)很慢?

我有一个大约 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) 分钟。为什么在管道传输时排序如此缓慢?不是并行的吗?

编辑

awkmyBigFile并不重要,这个实验是通过简单地使用可重复的seq 1 10000000 | sort --parallel 56(感谢@Sergei Kurenkov),我也观察到使用我的机器上取消管道版本六倍的速度提高。

linux sorting

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

Google 搜索是如何工作的

最近了解了FNV哈希,出于纯粹的好奇,我就2166136261在Google上搜索了魔法常数。

\n\n

我非常惊讶地发现FNV 哈希的维基百科页面显示为第三个搜索结果。然而,当我打开wiki页面时,我发现该常量2166136261没有出现在文章中(甚至没有出现在源代码中)。

\n\n

Google 搜索怎么可能得到这个结果,或者它“知道”FNV 和 之间的关系吗2166136261

\n\n

编辑

\n\n

为了确保搜索结果不会受到我的搜索历史的影响,我还在google.com.hk上尝试了隐身模式,Wiki结果仍然显示为第10个结果,而不是第3个。

\n\n

而且它与第 1 到第 9 个结果有很大不同,因为它们大多数都是源代码,例如unsigned hash = 2166136261u ...

\n\n

在这种情况下,我不确定 Google 是否看到 2166136261 和 Fowler\xe2\x80\x93Noll\xe2\x80\x93Vo 是“同义词”(或者它们在某种程度上相关),显然搜索“Fowler\xe2\x80\ x93Noll\xe2\x80\x93Vo" 将返回非常不同的结果。

\n

google-search

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

我如何使用SVML指令

我正在尝试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指令是否启用?

c++ x86 sse simd

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

在调用函数时阻止int的转换

我有以下代码:

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)

c++ casting c++11

4
推荐指数
1
解决办法
147
查看次数

为什么long long不是int64_t但它们有相同的大小?

我在电脑上试过这个

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 longint64_t互换,因为它们都是整数类型且大小相同吗?

c++ type-traits

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

我能改变for循环的起始条件吗?

我的代码中有这个

for (int i=max_position; i<N; ++i) { ... }

但是,在循环内部我要更新它的值max_position,这会影响我的for循环吗?

c++ for-loop

2
推荐指数
1
解决办法
123
查看次数

如何将"\ r"打印到文件

我想在我的程序中显示一个进度条,所以我添加了这个

#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);丢失.

是否可以将所有行保留在文件中?

c printf carriage-return

2
推荐指数
1
解决办法
516
查看次数

标签 统计

c++ ×4

c ×1

c++11 ×1

carriage-return ×1

casting ×1

for-loop ×1

google-search ×1

linux ×1

printf ×1

simd ×1

sorting ×1

sse ×1

type-traits ×1

x86 ×1