小编Pro*_*ish的帖子

以降序排序数组的最快方法

为什么是以下代码

Array.Sort(values);
Array.Reverse(values);
Run Code Online (Sandbox Code Playgroud)

与以下相比,按降序排序数组的速度要快得多

Array.Sort(values, (a,b)=>(-a.CompareTo(b)));
Run Code Online (Sandbox Code Playgroud)

代码在调试器外部的发布模式下运行.

为阵列生成降序排序的最有效方法是什么,最好是在一个班轮中?

c# sorting

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

C#二叉树和字典

我正在努力解决何时使用二叉搜索树以及何时使用字典的概念.

在我的应用程序中,我做了一个小实验,使用了C5库TreeDictionary(我相信是一个红黑二叉搜索树)和C#字典.字典在添加/查找操作时总是更快,并且总是使用更少的内存空间.例如,在16809 <int, float>个条目中,字典使用342 KiB,而树使用723 KiB.

我认为BST应该是更高效的内存,但似乎树的一个节点需要比字典中的一个条目更多的字节.是什么赋予了?BST比词典更好吗?

另外,作为一个附带问题,是否有人知道是否存在更快+更高内存效率的数据结构,用于存储<int, float>字典类型访问对,而不是上述任何一种结构?

c# dictionary c5 binary-search-tree

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

通过编写C dll来加速C#中的数学代码?

我有一个非常大的嵌套for循环,其中对浮点数执行一些乘法和加法.

for (int i = 0; i < length1; i++)
{
    double aa = 0;
    for(int h = 0; h < 10; h++)
    {
       aa += omega[i][outsideGeneratedAddress[h]];
    }

    double alphaOld = alpha;
    alpha = Math.Sqrt(alpha * alpha + aa * aa);

    s = -aa / alpha;
    c = alphaOld / alpha;

    for(int j = 0; j <= i; j++)
    {
        double oldU = u[j];
        u[j] = c * oldU + s * omega[i][j];
        omega[i][j] = c * omega[i][j] - s …
Run Code Online (Sandbox Code Playgroud)

.net c c# performance

12
推荐指数
3
解决办法
2195
查看次数

循环的SSE SIMD优化

我在循环中有一些代码

for(int i = 0; i < n; i++)
{
  u[i] = c * u[i] + s * b[i];
}
Run Code Online (Sandbox Code Playgroud)

因此,u和b是相同长度的向量,c和s是标量.这个代码是否适合与SSE一起使用的矢量化以获得加速?

UPDATE

我学习了矢量化(事实证明,如果你使用内在函数,它并不那么难)并在SSE中实现了我的循环.但是,在VC++编译器中设置SSE2标志时,我获得的性能与我自己的SSE代码相同.另一方面,英特尔编译器比我的SSE代码或VC++编译器快得多.

这是我写的代码供参考

double *u = (double*) _aligned_malloc(n * sizeof(double), 16);
for(int i = 0; i < n; i++)
{
   u[i] = 0;
}

int j = 0;
__m128d *uSSE = (__m128d*) u;
__m128d cStore = _mm_set1_pd(c);
__m128d sStore = _mm_set1_pd(s);
for (j = 0; j <= i - 2; j+=2)
{
  __m128d uStore = _mm_set_pd(u[j+1], u[j]);

  __m128d cu …
Run Code Online (Sandbox Code Playgroud)

sse simd visual-c++

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

C#最后用一个元素增加一个数组

在我的程序中,我有一堆增长的数组,其中一个新元素逐个生长到数组的末尾.我识别词典是在我的程序的一个关键部分的速度瓶颈,由于在以与阵列比较它们的慢的存取时间 - 切换到阵列增加的性能极大到可接受的水平.所以为了增长数组我正在使用Array.Resize.这很好用,因为我的实现将数组大小限制为大约20个元素,因此Array.Resize的O(N)性能是有限的.

但是如果有一种方法可以在最后用一个元素增加数组而不必使用Array.Resize,那会更好; 我相信它会将旧数组的副本复制到新大小的数组中.

所以我的问题是,是否有更有效的方法在不使用List或Array.Resize的情况下将一个元素添加到数组的末尾?

c# arrays dynamic-arrays

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

基于分数排序

我有一个包含一组排名的一维数组.例如

0 | 0
1 | 2
2 | 2
3 | 1
4 | 0
5 | 1

(这里显示的第一列是数组索引)

我喜欢这样排名

1 | 2
2 | 2
3 | 1
5 | 1
0 | 0
4 | 0

请注意,当存在平局时,索引将按数字递增顺序保留.我应该考虑采用什么样的算法?

sorting algorithm

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