- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经实现了一个 C++ 类,它的行为与标准 int
非常相似。类型。不同之处在于它有一个额外的概念“epsilon”,它表示一些远小于 1 但大于 0 的微小值。一种认为它的方式是一个非常宽的定点数,具有 32 个 MSB(整数部分),32 个 LSB(epsilon 部分)和中间的大量零点。 (注意:此类与普通定点数的一个很大区别是有两个符号,而不是一个:“value”和“epsilon”可以相互独立地为负数,而对于定点数,有一个符号表示整个数字。)
下面的类有效,但在整个程序中引入了大约 2 倍的速度损失。 (该程序包含与该类无关的代码,因此该类的实际速度损失可能远大于 2 倍。)我无法粘贴使用该类的代码,但我可以说以下内容:
+, -, +=, <, >
和 >=
是唯一被大量使用的运算符。使用setEpsilon()
和 getInt()
极为罕见。 *
也很少见,甚至根本不需要考虑 epsilon 值。
这是类:
#include <limits>
struct int32Uepsilon {
typedef int32Uepsilon Self;
int32Uepsilon () { _value = 0;
_eps = 0; }
int32Uepsilon (const int &i) { _value = i;
_eps = 0; }
void setEpsilon() { _eps = 1; }
Self operator+(const Self &rhs) const { Self result = *this;
result._value += rhs._value;
result._eps += rhs._eps;
return result; }
Self operator-(const Self &rhs) const { Self result = *this;
result._value -= rhs._value;
result._eps -= rhs._eps;
return result; }
Self operator-( ) const { Self result = *this;
result._value = -result._value;
result._eps = -result._eps;
return result; }
Self operator*(const Self &rhs) const { return this->getInt() * rhs.getInt(); } // XXX: discards epsilon
bool operator<(const Self &rhs) const { return (_value < rhs._value) ||
(_value == rhs._value && _eps < rhs._eps); }
bool operator>(const Self &rhs) const { return (_value > rhs._value) ||
(_value == rhs._value && _eps > rhs._eps); }
bool operator>=(const Self &rhs) const { return (_value >= rhs._value) ||
(_value == rhs._value && _eps >= rhs._eps); }
Self &operator+=(const Self &rhs) { this->_value += rhs._value;
this->_eps += rhs._eps;
return *this; }
Self &operator-=(const Self &rhs) { this->_value -= rhs._value;
this->_eps -= rhs._eps;
return *this; }
int getInt() const { return(_value); }
private:
int _value;
int _eps;
};
namespace std {
template<>
struct numeric_limits<int32Uepsilon> {
static const bool is_signed = true;
static int max() { return 2147483647; }
}
};
上面的代码可以工作,但是速度很慢。有没有人对如何提高性能有任何想法?我可以提供一些可能有用的提示/细节:
int32_t
之间的显着性能差异和 int64_t
,所以内存开销本身可能不是这里的问题。最佳答案
要尝试的一件事是定义例如的规范实践。 operator+
在 operator+=
方面:
Self operator+(const Self &rhs) const { return Self(*this) += rhs; }
这有助于 return-value optimization ,这消除了按值返回所需的复制构造函数。
此外,它还减少了代码维护!
关于c++ - 试图减少几乎但不完全是整数类的速度开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051239/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!