我发现这个(在这里,如果你必须知道),它引起了我的注意.
$ perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
Run Code Online (Sandbox Code Playgroud)
我知道perl.但我不知道它是如何做到的.
$ perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' <(echo 'zz\nabc\n3535\ndef') <(echo 'abc\ndef\nff')
abc
def
Run Code Online (Sandbox Code Playgroud)
看起来它只是吐出了共享的输入文件的行.现在将每一行放入哈希作为键或其他内容,我可以看到它如何帮助实现该任务,但是......那个正则表达式到底是怎么回事?
再考虑一下,使用它也不.=是很明显.
我试图理解这段代码,并且我发现了一些关于这个主题的更多内容。
以紧凑的形式:
#include <tuple>
namespace sqlite {
namespace utility {
template<typename> struct function_traits;
template <typename Function>
struct function_traits : public function_traits<
decltype(&Function::operator())
> { };
template <
typename ClassType,
typename ReturnType,
typename... Arguments
>
struct function_traits<
ReturnType(ClassType::*)(Arguments...) const
> {
typedef ReturnType result_type;
template <std::size_t Index>
using argument = typename std::tuple_element<
Index,
std::tuple<Arguments...>
>::type;
static const std::size_t arity = sizeof...(Arguments);
};
}
}
Run Code Online (Sandbox Code Playgroud)
这使我了解了该语言的指向成员函数的指针特性,并且此时我非常清楚如何使用函数特征(相当简单,我不仅可以提取返回类型,还可以提取数量,甚至参数的类型),但我一直在理解为什么它有效,或者为什么它甚至可能有效......
我在讨论中提出了基本相同的问题.特别是我想提到这个最终答复:
我认为在这个帖子中有两个不同的问题混合在一起:
使用输入或输出数据到线程的2D或3D映射是否有性能优势?对于您和其他人描述的所有原因,答案是"绝对的".如果数据或计算具有空间局部性,那么应该将工作分配给warp中的线程.
使用CUDA的多维网格来完成这项工作任务是否有性能优势?在这种情况下,我不这么认为,因为你可以在内核顶部自己轻松地进行索引计算.这会烧掉一些算术指令,但与内核启动开销相比,这应该可以忽略不计.
这就是为什么我认为多维网格旨在作为程序员的便利而不是提高性能的方法.但是,您确实需要考虑每个warp的内存访问模式.
我想知道今天这种情况是否仍然存在.我想知道为什么需要一个多维的"外部"网格.
我想要了解的是,这是否有一个重要的目的(例如空间位置的实际好处)或是为了方便它(例如在图像处理环境中,它是否只有我们可以有CUDA要知道特定块正在处理的x/y"补丁",以便它可以将它报告给CUDA Visual Profiler或其他东西)?
第三种选择是,这只不过是早期版本的CUDA的延续,它是硬件索引限制的一种解决方法.
fs.appendFile()重复调用函数是否安全?您可以考虑的一个人为示例是使用jschild_process.spawn实现的“for-async-of”循环tee。我们以块的形式获取文件数据,并希望将它们附加到文件中并执行其他处理。如果appendFile()promisified 和awaited,则执行将暂停,直到我们知道文件已写入,这可能会浪费时间。但是,如果我不等待,我就不再确定我可能会快速重复调用appendFile可能会导致隔行扫描输出文件。
节点fs库是否为我执行文件锁定?这样做的有效方法是什么?我应该编写一个辅助类来将工作卸载到它自己的异步附加循环中吗?
这是我到目前为止的测试,虽然似乎永远不会有定论,但这是令人鼓舞的:
#!/usr/bin/env node
const spawn = require('child_process').spawn;
const fs = require('fs');
const util = require('util');
const start = new Date();
const proc = spawn('seq 1 200000', { shell:true });
proc.stdout.setEncoding('utf8');
(async()=>{
for await (const data of proc.stdout) {
console.log(new Date() - start, `got ${data.length} chars of stdout`);
util.promisify(fs.appendFile)('junk', data);
};
})();
Run Code Online (Sandbox Code Playgroud)
输出:
5 'got 8192 chars of stdout'
7 'got 65536 chars of stdout' …Run Code Online (Sandbox Code Playgroud) 我有一个窗口,我想显示在其他一切之上.我的代码能够成功地强制它几乎在每个窗口之上,除了其他最顶层的窗口.这是我使用的代码:
SetWindowPos(getSDLWindow(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
Run Code Online (Sandbox Code Playgroud)
每次单击鼠标中键时都会执行此行(我使用鼠标钩来触发它).
一旦我启动我的程序,并从中点击一次,从那时起,我的窗口仍然在所有"常规"窗口之上.
但是,所有"特殊窗口"似乎与我的应用程序窗口属于同一类别,即聚焦时的特殊窗口显示在我的应用程序窗口上方.在这类特殊窗口中是任务栏(使用开始菜单似乎也激活),右键单击菜单(即使是由常规窗口生成),任务管理器,我相信很多其他人.事实上,我相当确定任何其他"最顶层"的窗口都会以这种方式运行.似乎通过我的SetWindowPos调用我已将应用程序窗口的状态提升到最顶层的窗口.
什么是我可以启动任务管理器,将其移动到我的应用程序窗口(现在它正在覆盖它),然后在任务管理器中间单击,现在我的应用程序窗口弹回到前面(同时焦点仍然是在任务管理器上).这很好,但我想更进一步,这样无论如何我的窗口都会在顶部.
除了SetWindowPos在循环中反复触发之外,还有其他方法可以实现吗?如果可能的话,我想避免这种情况.
与此问题相关.
这是一个小提琴:http://jsfiddle.net/DRbRS/
注意红色轮廓列表div如何不在绿色容器div的底部对齐.
问题在于,即使标题的高度已知,也无法提前知道列表的最终高度应该是多少.
有没有办法解决这个问题而不诉诸javascript?
我们需要的是一种风格 height: fill;
假设我想用第N位设置构建位掩码.我有N作为整数.
哪个更好?1 << N或查找表(指针算术加法)?
我的猜测是单个位移操作比内存查找更快,并且只有一次缓存热才能使LUT有机会.但是,如果是这种情况,那么为什么LUT通常是比特错误问题中最快的解决方案呢?是不是因为我们的CPU现在拥有巨大的缓存?
让我对这个问题进行限定,因为在x86-64这个时刻我最关心这个操作.
在从高性能代码中删除条件分支时,将真实布尔值转换unsigned long i = -1为设置所有位可能很有用.
我想出了一种方法来从一个int b(或bool b)取值的输入获得这个整数掩码布尔值:1或者0:
unsigned long boolean_mask = -(!b);
Run Code Online (Sandbox Code Playgroud)
获得相反的价值:
unsigned long boolean_mask = -b;
Run Code Online (Sandbox Code Playgroud)
以前有人看过这个建筑吗?我有事吗?当int值-1(我假设-b或-(!b)确实产生)被提升为更大的unsigned int类型时,它是否保证设置所有位?
这是上下文:
uint64_t ffz_flipped = ~i&~(~i-1); // least sig bit unset
// only set our least unset bit if we are not pow2-1
i |= (ffz_flipped < i) ? ffz_flipped : 0;
Run Code Online (Sandbox Code Playgroud)
我会在下次问这样的问题之前检查生成的asm.听起来很可能编译器不会在这里给分支带来负担.
>>> gen = iter(['a','b','c','d'])
>>> for i, line in enumerate(gen):
... print str(i) + ', ' + line
... if (i == 1):
... print 'saw 1'
... print 'next: ' + gen.next()
...
0, a
1, b
saw 1
next: c
2, d
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我更愿意看到3, d理解(我想保留一个不变量,如果你愿意:因为还有什么其他理由可以enumerate服务?)是i对应于索引的line.在next()接管了转储.
遗憾的是,这个尝试失败了,i因为设置为for循环认为它应该是什么:
>>> gen = iter(['a','b','c','d'])
>>> for i, line in enumerate(gen):
... print str(i) + ', ' + line
... if (i …Run Code Online (Sandbox Code Playgroud) 我今天看到了一些意外的事
$ bash -c 'false'
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
这是预期的.
$ bash -c '[ false ]'
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
笏.
同理:
$ if [ false ]; then echo 'true'; fi
true
Run Code Online (Sandbox Code Playgroud)
我想我明白,那test也[不会执行它的论点.但是......它真正做到了什么呢?