几天前在Facebook上的演讲 - 幻灯片,视频,Andrei Alexandrescu谈到可能证明我们错了的共同直觉.对我来说,幻灯片7中出现了一个非常有趣的观点,他指出假设"更少的指令=更快的代码"是不正确的,更多的指令并不一定意味着更慢的代码.
这就是我的问题:他的谈话的音质(大约6:20分钟)不是那么好,我不太理解这个解释,但从我得到的是他将退役指令与算法的最优性进行比较绩效水平.
但是,根据我的理解,这是不可能做到的,因为这是两个独立的结构层面.说明(特别是实际上已退役的说明)是一项非常重要的措施,基本上可以让您了解实现目标的绩效.如果我们省略指令的延迟,我们可以推断出更少的退出指令=更快的代码.现在,当然有些情况下,在循环内执行复杂计算的算法即使在循环内执行也会产生更好的性能,因为它会更早地破坏循环(想想图遍历).但是,与复杂程度的算法进行比较而不是说这个循环有更多指令并且比另一个更好会不会更有用?从我的观点来看,更好的算法最终会有更少的退役指令.
有人可以帮助我了解他的例子,以及如何(显着)更多退休指令可以带来更好的表现吗?
我的代码遇到了以下问题:我使用Valgrind和gperftools来执行堆检查和堆分析,以查看是否释放了我分配的所有内存.这些工具的输出看起来很好,似乎我没有失去记忆.然而,当我看着我top的输出时ps我很困惑,因为这基本上不代表我用valgrind和gperftools观察到的东西.
这是数字:
我现在的问题是,差异来自哪里?我也试过跟踪Valgrind中的堆栈使用情况但没有任何成功.
更多细节:
你有什么想法,报告内存消耗的差异来自哪里?如何验证我的程序是否正常运行?您有什么想法我可以进一步调查此问题吗?
Linux内核使用/ sys中的sysfs文件系统公开有关当前环境的信息.我有兴趣获取有关在线CPU及其内存层次结构(1级到3级缓存)的信息.
由于所有这些信息基本上都是文本文件,我可以自己编写解析器,但我很好奇在sysfs中处理信息的最佳方法是什么.目前我发现了两种选择:
libsysfs
和
libudev
这个libsysfs代码的缺点似乎是现在差不多5年了,几乎没有可用的文档,libudev看起来更活跃,但文档很少见.我找到的只有一个有用的教程libudev- http://www.signal11.us/oss/udev/
在C/C++中处理sysfs内容的最新方法是什么?
[更新]
目前,/sys/devices/system由于暴露的信息不是真实设备,因此不可能访问存储的数据.访问此数据的唯一方法是手动执行此操作.
我正在玩Go,并想知道在Go中执行惯用类型转换的最佳方法是什么.基本上我的问题之间的自动类型转换中规定uint8,uint64和float64.根据我对其他语言的经验,a uint8与a 的乘法uint64将产生一个uint64值,但在go中则不然.
这是我构建的一个示例,我问这是否是编写此代码的惯用方法,或者我是否缺少重要的语言结构.
package main
import ("math";"fmt")
const(Width=64)
func main() {
var index uint32
var bits uint8
index = 100
bits = 3
var c uint64
// This is the line of interest vvvv
c = uint64(math.Ceil(float64(index * uint32(bits))/float64(Width)))
fmt.Println("Test: %v\n", c)
}
Run Code Online (Sandbox Code Playgroud)
从我的观点来看,由于所有显式类型转换,上限值的计算似乎不必要复杂.
谢谢!
在我的实现中,我为JavaScript提供了一个接受参数的函数。
v8::Handle<v8::Value> TableGetValueIdForValue(const v8::Arguments& args) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope handle_scope(isolate);
auto val = args[1];
if (val->IsNumber()) {
auto num = val->ToNumber();
// How to check if Int or Double
} else {
// val == string
}
}
Run Code Online (Sandbox Code Playgroud)
现在,此参数基本上可以具有任何类型。当我支持Int,Float和String时,我想有效地检查这些类型。使用IsNumber()和IsStringObject()我可以确保对象是数字或字符串。
但是现在我需要区分整数值和浮点数。进行此测试的最佳方法是什么?有没有一种方法可以调用/使用typeof暴露给JS 的函数?
我正在实现一个小的密集矩阵类,而不是计划get/set运算符,我想使用运算符重载来使API更加可用和连贯.
我想要实现的非常简单:
template<typename T>
class Matrix
{
public:
/* ... Leaving out CTOR and Memory Management for Simplicity */
T operator() (unsigned x, unsigned y){/* ... */ }
};
Matrix<int> m(10,10);
int value = m(5,3); // get the value at index 5,3
m(5,3) = 99; // set the value at index 5,3
Run Code Online (Sandbox Code Playgroud)
虽然通过重载直接获得价值operator(),但我无法理解定义setter.根据我的理解,运算符优先级将operator()在赋值之前调用,但是不能重载operator()以返回正确的左值.
解决这个问题的最佳方法是什么?
我目前正在麻烦地正确理解新std::atomic类型的用法.对于我的情况,我有以下假设:
uint64_t存储在内存中的值的连续内存位置最初我实现了这样的方法
uint64_t inc(const size_t pos) { return _data[pos]++; }
uint64_t atomic_inc(const size_t pos) { return __sync_fetch_and_add(&_data[pos], 1); }
Run Code Online (Sandbox Code Playgroud)
现在我想把它正确地移植到C++ 11,并且想知道我该如何正确处理它.根据我对std :: atomic_fetch_add的理解,基本上需要一个原子积分值才能做到这一点.但是,我如何正确地实现这一点,以便我可以使用原子变量指向某个位置并增加该值?
谢谢!