小编das*_*ght的帖子

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

我有一个500000随机生成的Tuple<long,long,string>对象列表,我在其上执行一个简单的"之间"搜索:

var data = new List<Tuple<long,long,string>>(500000);
...
var cnt = data.Count(t => t.Item1 <= x && t.Item2 >= x);
Run Code Online (Sandbox Code Playgroud)

当我生成随机数组并运行我的搜索100个随机生成的值时x,搜索在大约四秒内完成.知道了的伟大奇迹的整理确实给搜索,但是,我决定把我的排序数据-首先Item1,然后Item2,最后由Item3运行我的100次的搜索之前- .我期望排序版本由于分支预测而执行得更快一些:我的想法是,一旦我们达到这一点Item1 == x,所有进一步检查t.Item1 <= x将正确地预测分支为"不接受",加快了尾部的速度.搜索.令我惊讶的是,搜索在排序的阵列上花了两倍的时间!

我尝试切换运行实验的顺序,并为随机数生成器使用不同的种子,但效果是一样的:在未排序的数组中搜索的速度几乎是同一数组中搜索的两倍,但是排序!

有没有人对这种奇怪的效果有一个很好的解释?我的测试的源代码如下; 我使用的是.NET 4.0.


private const int TotalCount = 500000;
private const int TotalQueries = 100;
private static long NextLong(Random r) {
    var data = new byte[8];
    r.NextBytes(data);
    return BitConverter.ToInt64(data, 0);
}
private class TupleComparer : IComparer<Tuple<long,long,string>> …
Run Code Online (Sandbox Code Playgroud)

.net c# language-agnostic performance

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

检查两个列表是否相等

我有一个课程如下:

public class Tag {
    public Int32 Id { get; set; }
    public String Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有两个标签列表:

List<Tag> tags1;
List<Tag> tags2;
Run Code Online (Sandbox Code Playgroud)

我使用LINQ的select来获取每个标签列表的ID.然后:

List<Int32> ids1 = new List<Int32> { 1, 2, 3, 4 };
List<Int32> ids2 = new List<Int32> { 1, 2, 3, 4 };
List<Int32> ids3 = new List<Int32> { 2, 1, 3, 4 };
List<Int32> ids4 = new List<Int32> { 1, 2, 3, 5 };
List<Int32> ids5 = new List<Int32> { 1, 1, …
Run Code Online (Sandbox Code Playgroud)

c# linq

156
推荐指数
3
解决办法
20万
查看次数

使用SqlCommand Async方法时性能很差

使用异步调用时,我遇到了严重的SQL性能问题.我创建了一个小案例来证明这个问题.

我在SQL Server 2016上创建了一个数据库,它驻留在我们的LAN中(因此不是localDB).

在该数据库中,我有一个WorkingCopy包含2列的表:

Id (nvarchar(255, PK))
Value (nvarchar(max))
Run Code Online (Sandbox Code Playgroud)

DDL

CREATE TABLE [dbo].[Workingcopy]
(
    [Id] [nvarchar](255) NOT NULL, 
    [Value] [nvarchar](max) NULL, 

    CONSTRAINT [PK_Workingcopy] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

在该表中,我插入了一条记录(id='PerfUnitTest',Value是一个1.5mb的字符串(一个较大的JSON数据集的zip)).

现在,如果我在SSMS中执行查询:

SELECT [Value] 
FROM [Workingcopy] 
WHERE id = 'perfunittest'
Run Code Online (Sandbox Code Playgroud)

我立即得到结果,我在SQL Servre Profiler中看到执行时间大约是20毫秒.一切正常.

使用plain从.NET(4.6)代码执行查询时SqlConnection:

// at this point, the connection …
Run Code Online (Sandbox Code Playgroud)

.net c# sql-server asynchronous async-await

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

始终使用智能指针是一种好习惯吗?

我发现智能指针比原始指针更舒服.那么总是使用智能指针是一个好主意吗?(请注意,我来自Java背景,因此不太喜欢显式内存管理的想法.所以除非智能指针存在一些严重的性能问题,否则我想坚持使用它们.)

注意:虽然我来自Java背景,但我非常了解智能指针的实现和RAII的概念.因此,在发布答案时,您可以将这些知识视为我的理所当然.我几乎到处都使用静态分配,只在必要时才使用指针.我的问题仅仅是:我是否可以使用智能指针代替原始指针?

c++

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

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

我可以使用VARCHAR作为PRIMARY KEY吗?

我有一个存储优惠券/折扣的表,我想使用coupon_code列作为主键,这是一个VARCHAR.

我的理由是,每个优惠券都有一个唯一的代码,我将运行的唯一命令是 SELECT ... FROM ... WHERE coupon_code='..'

我不会进行任何连接或索引,并且我没有看到此表中有超过几百个条目.

在我看来,这将是好的,但我不知道是否有任何我缺少/没有考虑的事情.

mysql sql varchar unique primary-key

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

initwithstyle:reuseIdentifier:未调用

我正在创建自己的自定义UITableViewCell用作原型单元的后端.在我的类中,我重写了initwithstyle:reuseIdentifier:方法来进行一些自定义初始化,但我的初始化程序没有被调用.我在其内部的第一行有一个断点,以及一个断点dequeueResusableCellWithIdentifier:.dequeueResusableCellWithIdentifier:调用该方法,它返回一个已启动的单元格,但未达到断点initwithstyle:reuseIdentifier:.任何帮助都会很棒.

uitableview ios

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

将所有Xcode设置恢复为原始状态

当我无法再开始搜索时,我的Xcode进入了非功能状态:一旦按下⌘+F,Xcode就会挂着旋转的风车,并停止响应.一旦发生这种情况,我唯一的选择是强制退出并重新启动.

我尝试在工作区和项目目录中查找已保存的设置,但我想要删除的最近搜索选项似乎存储在其他位置.我知道我可以通过UI清除最近的搜索,但这需要启动搜索对话框,它会挂起Xcode.

我想将Xcode重置为原始状态.如何在不重新安装Xcode的情况下执行此操作?

xcode xcode5

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

序列点和运算符优先级之间有什么区别?

考虑经典序列点示例:

i = i++;
Run Code Online (Sandbox Code Playgroud)

C和C++标准声明上述表达式的行为未定义,因为=运算符与序列点无关.

让我感到困惑的是,++优先级高于优先级=,基于优先级的上述表达式必须首先进行评估i++然后进行赋值.因此,如果我们开始i = 0,我们应该总是i = 0(或者i = 1,如果表达式i = ++i)结束而不是未定义的行为.我错过了什么?

c c++ language-lawyer

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

为什么java stream.count()返回long?

为什么不stream.count()退货int

我明白,我可以很容易地转换longint铸造,

return (int) players.stream().filter(Player::isActive).count();
Run Code Online (Sandbox Code Playgroud)

但是为什么 java会stream.count()返回long而不是int

java java-8 java-stream

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