小编Chr*_*mer的帖子

跟踪位操作的优化机会?

你觉得函数haswon有优化的余地吗(见下文)?

我认为,从不断变化的参数类型__int64,以unsigned __int64取得该函数更快,所以我thougt也许还有优化的机会.

更详细: 我正在写一个连接四游戏.最近我使用了Profiler Very Sleepy,并认识到函数haswon使用了大部分的cpu-time.该功能使用连接四板的位板表示给一个玩家.我在fourstones基准测试的源代码中发现了这个函数.位板表示如下:

.  .  .  .  .  .  .  TOP
5 12 19 26 33 40 47
4 11 18 25 32 39 46
3 10 17 24 31 38 45
2  9 16 23 30 37 44
1  8 15 22 29 36 43
0  7 14 21 28 35 42  BOTTOM
Run Code Online (Sandbox Code Playgroud)

功能:

// return whether newboard includes a win
bool haswon(unsigned __int64 …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization 64-bit bit-manipulation

12
推荐指数
1
解决办法
1789
查看次数

如何用原始类型进行模乘法

有没有办法构建例如(853467 * 21660421200929) % 100000000000007没有BigInteger库(请注意,每个数字都适合64位整数,但乘法结果不适合)?

这个解决方案效率低下:

int64_t mulmod(int64_t a, int64_t b, int64_t m) {
    if (b < a)
        std::swap(a, b);
    int64_t res = 0;
    for (int64_t i = 0; i < a; i++) {
        res += b;
        res %= m;
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

c++ algorithm

12
推荐指数
4
解决办法
6301
查看次数

C. usleep的时间延迟

我正在开发用C编写的游戏服务器.我需要开发一个具有特定频率(每秒50次)的循环来执行算法.问题是我无法暂停程序一段精确的时间间隔 - 20000微秒.函数usleep(20000)运行大约30000微秒.结果总是比预期的10000微秒更多.

这是我的简单代码示例:

#include <stdio.h>
#include <time.h>
#include <unistd.h>

int main( int argc, char ** argv )
{

        const unsigned long long nano = 1000000000;
        unsigned long long t1, t2;

        struct timespec tm;

        for(;;)
        {

                clock_gettime( CLOCK_REALTIME, &tm );
                t1 = tm.tv_nsec + tm.tv_sec * nano;

                usleep( 20000 );

                clock_gettime( CLOCK_REALTIME, &tm );
                t2 = tm.tv_nsec + tm.tv_sec * nano;

                printf( "delay: %ld\n", ( t2 - t1 ) / 1000 );
        }

        return 0;

}
Run Code Online (Sandbox Code Playgroud)

它运行的结果是:

$ …
Run Code Online (Sandbox Code Playgroud)

c timedelay usleep

12
推荐指数
2
解决办法
6万
查看次数

为什么std :: bitset实例中的std :: swap of Bits不起作用?

在下面的例子中,我期望比特的交换.相反,第二位被覆盖,但为什么以及如何实现预期的行为呢?

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    bitset<2> test(string("10"));
    cout << test; // Prints "10"
    swap(test[0], test[1]);
    cout << test; // Prints "11", why not "01"?
}
Run Code Online (Sandbox Code Playgroud)

c++

10
推荐指数
1
解决办法
1673
查看次数

CutyCapt的替代品

有没有替代Cutycapt ..可以使用Java库访问....

简而言之,Cutycapt是一个跨平台的命令行实用程序,用于捕获WebKit将网页呈现为各种矢量和位图格式,包括SVG和PNG(1).

java cutycapt

10
推荐指数
1
解决办法
1928
查看次数

获得一个数字的有效方法,不能从任何XORing组合生成

如果[0 .. 2 64 ] 范围内的任何数字不能由给定集合中的一个或多个数字的任何XOR组合生成,那么是否存在打印至少一个无法到达的数字的有效方法,或者终止信息,没有无法访问的号码?这个问题有名字吗?它是否与另一个问题类似,或者您有任何想法,如何解决?

algorithm xor

10
推荐指数
1
解决办法
277
查看次数

如何在C风格的数组上使用find_if和reverse_iterator?

要使用POD元素搜索C-Array中元素的第一个出现,可以轻松实现std::find_if(begin, end, findit).但我需要最后一次出现.这个答案让我觉得这可以做到std::reverse_iterator.因此,我试过:

std::find_if(std::reverse_iterator<podtype*>(end),
             std::reverse_iterator<podtype*>(begin),
             findit);
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

无法在赋值时将'std :: reverse_iterator <xyz*>'转换为'xyz*'

您是否知道如何以这种方式进行操作或者您是否知道更好的解决方案?

这是代码:

#include <iostream>
#include <iterator>
#include <algorithm>

struct xyz {
    int a;
    int b;
};

bool findit(const xyz& a) {
    return (a.a == 2 && a.b == 3);
}

int main() {
    xyz begin[] = { {1, 2}, {2, 3}, {2, 3}, {3, 5} };
    xyz* end = begin + 4;

    // Forward find
    xyz* found = std::find_if(begin, end, findit);
    if (found …
Run Code Online (Sandbox Code Playgroud)

c++ arrays iterator reverse-iterator

10
推荐指数
1
解决办法
8027
查看次数

从临时流中提取char时GCC编译器错误

我正在尝试从流中读取单个字符.使用以下代码,我得到一个"模糊过载"编译器错误(GCC 4.3.2 和4.3.4).我做错了什么?

#include <iostream>
#include <sstream>

int main()
{
    char c;
    std::istringstream("a") >> c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

备注:

  • Visual Studio 2008编译时没有错误
  • 其他类型(int,double)正在工作
  • 如果我首先创建一个变量std::istringstream iss("a"); iss >> c,编译器不会给出错误

c++ compiler-errors g++ stringstream

9
推荐指数
1
解决办法
220
查看次数

如何使用搜索创建 MFC ComboBox

我需要一个具有搜索功能的 Windows MFC 应用程序中的组合框。它应该可以工作,以便如果您开始输入与列表中的一个或多个项目匹配的内容,组合框应该下拉并显示这些项目。有点像网络上流行的基于 ajax 的搜索框

您知道提供此功能的任何控件吗?- 有关于如何自己创建此类功能的信息的链接?- 有关于如何做到这一点的想法可以分享吗?

mfc ccombobox visual-c++

6
推荐指数
1
解决办法
5846
查看次数

随机内存访问很昂贵?

在优化我的连接四游戏引擎期间,我达到了一个点,在这一点上,进一步的改进只能是最小的,因为TableEntry te = mTable[idx + i]下面的代码示例中的指令使用了大部分CPU时间.

TableEntry getTableEntry(unsigned __int64 lock)
{
    int idx = (lock & 0xFFFFF) * BUCKETSIZE;
    for (int i = 0; i < BUCKETSIZE; i++)
    {
        TableEntry te = mTable[idx + i]; // bottleneck, about 35% of CPU usage
        if (te.height == NOTSET || lock == te.lock)
            return te;
    }
    return TableEntry();
}
Run Code Online (Sandbox Code Playgroud)

哈希表mTable定义为std::vector<TableEntry>并且具有大约4.2密耳.托管(约64 MB).我试图vector通过分配表来替换new没有速度改进的表.

我怀疑随机访问内存(因为Zobrist Hashing功能)可能很昂贵,但真的那么多?你有改进功能的建议吗?

谢谢!

编辑: BUCKETSIZE值为4.它用作碰撞策略.一个TableEntry的大小是16字节,结构如下所示: …

c++ memory optimization hash

6
推荐指数
2
解决办法
929
查看次数