小编ran*_*nk1的帖子

当存储桶数量增加时,为什么.NET group by会慢得多

给定这段简单的代码和10mln随机数组:

static int Main(string[] args)
    {
        int size = 10000000;
        int num =  10; //increase num to reduce number of buckets
        int numOfBuckets = size/num;
        int[] ar = new int[size];
        Random r = new Random(); //initialize with randum numbers
        for (int i = 0; i < size; i++)
            ar[i] = r.Next(size);

        var s = new Stopwatch();
        s.Start();
        var group = ar.GroupBy(i => i / num);
        var l = group.Count();
        s.Stop();

        Console.WriteLine(s.ElapsedMilliseconds);
        Console.ReadLine();
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我在分组方面做了一些表现,所以当桶的数量为10k时,估计执行时间为0.7s,对于100k桶,它是2s,对于1m桶,它是7.5s.

我想知道为什么会这样.我想如果使用HashTable实现GroupBy,可能会出现冲突问题.例如,最初哈希表是准备工作让我们说1000组,然后当组的数量增长时,它需要增加大小并进行重新散列.如果是这种情况我可以编写自己的分组,我会用预期数量的桶初始化HashTable,我做了但是它只是稍快一点​​.

所以我的问题是,为什么数量的桶会影响groupBy的性能呢?

编辑:在发布模式下运行将结果分别更改为0.55s,1.6s,6.5s.

我也更改了group.ToArray下面的一段代码只是为了强制执行分组: …

.net c# performance grouping group-by

13
推荐指数
2
解决办法
2612
查看次数

为什么在F#中处理数组比列表更快

我正在检查F#列表和数组的性能.鉴于代码:

let list = [ 1.. 100000 ]
for i in 1 .. 100 do ignore ( list|>List.map(fun n -> n))

let array = [| 1.. 100000 |]
for i in 1 .. 100 do ignore ( array|>Array.map(fun n -> n))
Run Code Online (Sandbox Code Playgroud)

我怀疑两者都会在非常相似的时间内运行.实际上,结果是阵列的速度提高了10倍以上:数组需要28毫秒,而列表需要346毫秒!这是为什么?我理解F#中列表的概念以及例如将值附加到列表或采用子序列的事实是耗时的,但是在这段代码中它只是遍历所有元素,所以我认为时间将是非常可比的.

Visual Studio 2012中的发布模式下的测试(在调试模式下,阵列的速度提高了约5倍).

arrays f# list

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

如何使用VS在Windows 7上安装Boost

所以我整天都在尝试将Boost与Visual Studio(2008)集成在Windows 7上.我首先通过这个如何在Visual Studio 2010中使用Boost两次.

我搜索了所有(至少有3个)simiral主题,但没有一个工作.

有些人建议使用这个:www.boostpro.com/download/但链接不活跃.有人建议将运行时库更改为多线程DLL,但也没有用.

我只是尝试包含#include <boost/thread.hpp>并得到此错误

致命错误LNK1104:无法打开文件'libboost_thread-vc90-mt-s-1_53.lib'.

在安装Boost之前,错误是找不到thread.hpp它,所以似乎Boost安装得有点正确.

问题是我在使用本教程时没有构建库.我该如何手动构建它们?

windows boost

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

如何使用lower_bound将值插入到排序向量中

我有一个指向A类的指针向量,我希望使用STL按int键进行排序.为此,我operator <在A类中定义了一个

bool operator< (const A &lhs, const A &rhs){
    return (lhs.key < rhs.key);
};
Run Code Online (Sandbox Code Playgroud)

在我的插入功能看起来像

vector<A*>::iterator it = lower_bound(vec.begin(), vec.end(), element);
vec.insert(it, element);
Run Code Online (Sandbox Code Playgroud)

我期望lower_bound返回可以放置新元素的第一个位置,但它不起作用.插入带有键0,1,2,3的对象将导致向量的顺序不正确(2,3,1,0).这是为什么 ?

也许我也可以使用比较器来实现这个目标:

比较upper_bound/lower_bound的函数

但我的代码出了什么问题?

c++ stl

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

如何在C++中以独占模式打开文件

我正在用C++实现一些文件系统.到目前为止我正在使用,fstream但我意识到不可能以独占模式打开它.由于有许多线程我想允许多次读取,并且在写入模式下打开文件时我想以独占模式打开文件?
最好的方法是什么?我认为Boost提供一些功能.还有其他可能性吗?我还想看一个简单的例子.如果在C++中做起来不容易/好,我也可以用C语言编写.

我正在使用Windows.

c++ io

5
推荐指数
2
解决办法
7216
查看次数

如何在Visual Studio中设置CUDA标志

我正在尝试在Visual Studio中测量我的CUDA项目中的寄存器溢出.为此,我使用标志-Xptxas -v,-abi = no,因为它是在这里写的 http://on-demand.gputechconf.com/gtc-express/2011/presentations/register_spilling.pdf

在我的VS 2010项目中,我尝试将此标志放入:

  1. properties/cuda/host /其他编译标志 - 没有效果.
  2. properties/cuda /命令行.编译以-1退出.
  3. properties/c /命令行.编译错误

在Cuda属性中,我还设置为Yes标志:生成GPU调试信息和Verbose PTXAS输出.我在输出窗口中寻找输出.怎么做得好?我的GPU有CC = 2.1.

编辑:所以将标志作为答案指示的正确位置是属性/ cuda /命令行.但我仍然没有得到预期的输出(即使在示例项目中).下面我展示了我在属性中的其他选项:cuda/device.

  1. C在PTXAS输出中交织 - 没有
  2. 代码生成 - compute_20,sm_21
  3. 生成GPU调试信息 - 是的
  4. 最大使用寄存器 - 0
  5. 详细的ptxas输出(是/否 - 测试两者).

cuda visual-studio-2010 compiler-flags

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

如何使用fstream指针对文件进行操作?

我想使用一些抽象操作流,因此我想使用fstream*而不是ifstream和ofstream.我试着做那样但是会导致访问违规:

char* text= "test"; 
fstream* o = new fstream(); 
o = &fstream("name.txt"); 
o->write(text, 4); 
o->close();
Run Code Online (Sandbox Code Playgroud)

我该如何解决它,或者使用其他想法?

我想在这种情况下使用指针(您可以在这里查看更多一般信息)如何在C++中实现我自己的IO文件API

更改后,它现在看起来像这样:

class GIO_Persistent_File_System : public GIO_CORE
{
public:
GIO_Persistent_File_System(void);
int open(char*, int);
int close();
void write(char* s, int size);
void read(char* s, int size);
public:
~GIO_Persistent_File_System(void);

private:
fstream file;
};

int GIO_Persistent_File_System::open(char* path, int mode){
file.open(path);
return 0;
}

int GIO_Persistent_File_System::close(){
file.close();
return 0;
}

void GIO_Persistent_File_System::write(char* s, int size){
file.write(s, size);
return;
}

void GIO_Persistent_File_System::read(char* s, int size){
file.read(s, size);
return; …
Run Code Online (Sandbox Code Playgroud)

c++ fstream

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

如何在F#中汇总多个列表

在F#中,我有很多列表(它们的实际数量因输入数据而不同),我想对所有这些列表进行聚合(假设为了简化而添加).所以我想要实现的是List.map2或List.map3所做的事情,但是对于更多的列表.

我怎么处理它?我想知道这是否可以与List.scan一起使用?

f# aggregate list

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

如何以响应方式撤消TFS中的大量文件

今天,我以某种方式管理了所有分支机构,在办理登机手续时给了我超过30k的文件.在撤消那些挂起的更改时,TFS变得无法响应.我试图按项目撤消那些待定的更改项目,但这样做花了我20分钟来撤消只有1k的文件.

我尝试了:我删除了所有文件的目录.在tfs中,我将映射的文件夹转换为"普通文件夹",但所有文件仍然在待处理的更改中显示在TFS中(即使它们被删除).

有什么方法可以解决我的问题吗?可能最好的解决方案是从TFS中删除这个目录,并再次创建该目录并获取最新信息,但是可能吗?

tfs tfs2012

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