相关疑难解决方法(0)

为什么处理排序数组比处理未排序数组更快?

这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned c = 0; c < arraySize; ++c)
        data[c] = std::rand() % 256;

    // !!! With this, the next loop runs faster.
    std::sort(data, data + arraySize);

    // Test
    clock_t start = clock();
    long long sum = 0;

    for (unsigned i = 0; i < 100000; ++i)
    {
        // Primary loop
        for (unsigned c = 0; c < arraySize; ++c) …
Run Code Online (Sandbox Code Playgroud)

c++ java optimization performance branch-prediction

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

尝试抓住加速我的代码?

我写了一些代码来测试try-catch的影响,但看到了一些令人惊讶的结果.

static void Main(string[] args)
{
    Thread.CurrentThread.Priority = ThreadPriority.Highest;
    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;

    long start = 0, stop = 0, elapsed = 0;
    double avg = 0.0;

    long temp = Fibo(1);

    for (int i = 1; i < 100000000; i++)
    {
        start = Stopwatch.GetTimestamp();
        temp = Fibo(100);
        stop = Stopwatch.GetTimestamp();

        elapsed = stop - start;
        avg = avg + ((double)elapsed - avg) / i;
    }

    Console.WriteLine("Elapsed: " + avg);
    Console.ReadKey();
}

static long Fibo(int n)
{
    long n1 = 0, n2 …
Run Code Online (Sandbox Code Playgroud)

.net c# clr try-catch performance-testing

1463
推荐指数
5
解决办法
10万
查看次数

C#编译器会优化此代码吗?

我经常遇到这种情况.乍一看,我认为,"这是糟糕的编码; 我正在执行一个方法两次并且必然会得到相同的结果."但是在想到这一点时,我不得不怀疑编译器是否像我一样聪明并且可以得出相同的结论.

var newList = oldList.Select(x => new Thing {
    FullName = String.Format("{0} {1}", x.FirstName, x.LastName),
    OtherThingId = x.GetOtherThing() != null : x.GetOtherThing().Id : 0 // Might call x.GetOtherThing() twice?
});
Run Code Online (Sandbox Code Playgroud)

编译器的行为是否依赖于GetOtherThing方法的内容?说它看起来像这样(有点类似于我现在的真实代码):

public OtherThing GetOtherThing() {
    if (this.Category == null) return null;
    return this.Category.OtherThings.FirstOrDefault(t => t.Text == this.Text);
}
Run Code Online (Sandbox Code Playgroud)

这将禁止对这些对象来自的任何商店进行非常糟糕的异步更改,如果连续运行两次,肯定会返回相同的内容.但如果它看起来像这样(为了论证而荒谬的例子):

public OtherThing GetOtherThing() {
    return new OtherThing {
        Id = new Random().Next(100)
    };
}
Run Code Online (Sandbox Code Playgroud)

连续两次运行会导致创建两个不同的对象,并且很可能具有不同的ID.编译器在这些情况下会做什么?它是否像我在第一个清单中所展示的那样低效?

自己做一些工作

我运行了与第一个代码清单非常相似的东西,并在GetOtherThing实例方法中添加了一个断点.断点被击中一次.所以,看起来结果确实是缓存的.在第二种情况下会发生什么,该方法可能每次返回不同的东西?编译器会不正确地优化?我发现结果有什么警告吗?

编辑

那个结论无效.请参阅@ usr的答案下的评论.

.net c# compiler-construction optimization

7
推荐指数
2
解决办法
918
查看次数

二进制逻辑运算符在Javascript中表达条件

我使用三元运算符,但经常想要检查没有else子句的东西.我想知道是否有任何简短的方法可以省略这一点.

我发现了

a ? b : {}
Run Code Online (Sandbox Code Playgroud)

作为替代if (a) {b},可以保存2个字符,但不能

a ? b :
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的,它是一个三元运算符.

我唯一的想法是那些空的花括号有点难看,有没有其他方法来指定一个空白的:语句?

或者,是否有二元?运算符?我在规范中翻找过,但看不出我是如何使用二进制逻辑运算符的,我猜这if就是为了什么.

有没有办法使用二进制逻辑运算符来表达{}的条件或简写?我知道这可能是3个角色的懒惰高度,但我只是好奇,如果有人有任何技巧可以分享.

javascript binary-operators ternary-operator logical-operators

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