小编Pet*_*etr的帖子

为什么检查字典是否包含密钥更快,而不是在不包含异常的情况下捕获异常?

想象一下代码:

public class obj
{
    // elided
}

public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Run Code Online (Sandbox Code Playgroud)

方法1

public static obj FromDict1(string name)
{
    if (dict.ContainsKey(name))
    {
        return dict[name];
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

方法2

public static obj FromDict2(string name)
{
    try
    {
        return dict[name];
    }
    catch (KeyNotFoundException)
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我很好奇这两个函数的性能是否存在差异,因为第一个函数应该比第二个函数更低 - 假设它需要在字典包含值时检查两次,而第二个函数确实只需要访问字典曾经但是WOW,它实际上是相反的:

循环1 000 000个值(现有10万个,不存在90 000个):

第一个功能:306毫秒

第二功能:20483毫秒

这是为什么?

编辑:你可以在下面这个问题的评论中注意到,如果有0个非现有密钥,第二个函数的性能实际上略好于第一个函数.但是,一旦存在至少一个或多个非现有密钥,则第二个密钥的性能会迅速下降.

c# performance dictionary

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

为什么这个记忆食者真的不吃记忆?

我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况.我创造了这个超级简单的记忆食者:

#include <stdio.h>
#include <stdlib.h>

unsigned long long memory_to_eat = 1024 * 50000;
size_t eaten_memory = 0;
void *memory = NULL;

int eat_kilobyte()
{
    memory = realloc(memory, (eaten_memory * 1024) + 1024);
    if (memory == NULL)
    {
        // realloc failed here - we probably can't allocate more memory for whatever reason
        return 1;
    }
    else
    {
        eaten_memory++;
        return 0;
    }
}

int main(int argc, char **argv)
{
    printf("I will try to eat %i kb of ram\n", memory_to_eat);
    int megabyte = …
Run Code Online (Sandbox Code Playgroud)

c linux memory virtual-memory

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

64位应用程序的内存使用开销是多少?

从我迄今为止发现的内容可以清楚地看出,针对64位架构编译的程序使用的内存量是其32位替代品的两倍 - https://superuser.com/questions/56540/32-bit-vs- 64位系统.

这是否意味着为64位编译的代码平均使用的RAM是32位版本的两倍?

我不知何故怀疑它,但我想知道真正的开销是什么.我想,小类型,如short,bytechar相同大小的64位架构?我不是很确定byte.鉴于许多应用程序使用大型字符串(如Web浏览器等),char在大多数实现中主要由数组组成,因此开销可能不会太大.

因此,即使数字类型在64位上更大intlong更大,是否会对RAM的使用产生重大影响?

c memory memory-management computer-architecture

44
推荐指数
2
解决办法
5547
查看次数

如何使用xbuild构建发布二进制文件

当我使用xbuild时,它总是使用debug作为目标,如何使用release?

例如,我会期待类似的东西

xbuild --release
Run Code Online (Sandbox Code Playgroud)

但这不起作用

c# xbuild

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

.net和IndexOf中的特殊符号

我发现了一个有趣的错误,甚至可能在.net中(还没有尝试过单声道).

IndexOf() string实例的方法是返回某些特殊符号的有符号值(-1或更低),

例如,我有一个字符串,其中包含一些特殊的unicode字符,这个字符串里面的某个地方是我正在寻找的冒号.Calling IndexOf(" :")对于肯定包含" :"返回的签名值的行

我会尝试在这里粘贴这个字符串,但是给定特殊符号可能很难:

hitchcock.freenode.net 322 petan #hobbiton 5 :????? > Good luck axa!

有办法解决这个问题吗?

c# string parsing

20
推荐指数
2
解决办法
2488
查看次数

为什么string.IsNullOrEmpty比比较快?

string.IsNullOrEmpty出于性能原因,MS Analyzer建议使用null或空字符串进行比较

警告470 CA1820:Microsoft.Performance:通过调用'String.IsNullOrEmpty'替换对'string.operator ==(string,string)'的调用.

这是为什么?不应该要求调用另一个函数并将它传递给某个对象,然后需要执行某种比较,这比执行比较本身要贵吗?

示例代码

void Foo()
{ // throws a warning
    string x = "hello world";
    if (x == null || x == "")
    {
        Console.WriteLine("Empty");
    }
}

void Foo()
{ // doesn't throw it
    string x = "hello world";
    if (string.IsNullOrEmpty(x))
    {
        Console.WriteLine("Empty");
    }
}
Run Code Online (Sandbox Code Playgroud)

c# performance

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

毛巾根(futex exploit)是如何工作的

Linux内核存在安全问题,这会影响大多数Android设备,并且基本上允许任何用户成为root用户.

由于我是linux用户很长一段时间,我很好奇这个漏洞是如何工作的,特别是如何检查我的PC(自定义内置)或我的任何服务器上的内核是否容易受到攻击.是否有任何源代码(最好是文档)或漏洞的详细信息,以便我可以看到它是如何工作的?我只能找到利用该漏洞的通用信息或封闭源二进制文件,并在任何用户执行时为您提供root权限,但没有背景信息或内核哪个部分存在缺陷的详细信息以及如何执行此操作.

到目前为止,我发现了这篇有趣的文章http://tinyhack.com/2014/07/07/exploiting-the-futex-bug-and-uncovering-towelroot/,它解释了它使用堆栈黑客,通过调用某些系统调用来得到一些东西futex_queue.虽然我理解它是如何工作的,但我不知道如何更改该堆栈中的任何内容实际上可以提升当前进程的权限.我发现有趣的是,这个人说,因为内核3.13已经发生了变化,现在需要不同的技术来利用它.这是否意味着这甚至没有修复,并且在最近可以从kernel.org下载的内核仍然可以利用

linux security

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

是否有可能在连接失败时重置Ansible?

我正面临着这个令人讨厌的错误:Ansible主机随机无法访问#18188 .

有没有办法告诉Ansible如果SSH连接失败,再试一次?还是2倍多?

根据这篇文章新的SSH重试在Ansible 2.0?有"重试"选项,但它对我来说似乎不值得信任,发布的人甚至没有获得SSH标题,并且在Ansible文档中没有提到这一点.

ansible ansible-2.x

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

如何将QDockWidget作为选项卡插入

我的应用程序中有很多小部件,我知道我可以在运行时拖动它们并将它们放在另一个小部件上以便合并它们(两个小部件都在同一个地方,它们下面有一些标签,我可以用来切换它们).

如何从头开始插入像这样的程序设计QDockWidget?

例如,我想在底部添加2个QDockWidgets,它们是标签式的,因此它们位于相同的区域,我可以选项卡切换它们

c++ qt

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

如何防止字符串被拦截

我的理解(可能是错误的)是在c#中创建一个字符串时它会被插入"实习池".这保持了对字符串的引用,以便多个相同的字符串可以共享操作内存.

但是我正在处理很多很可能是唯一的字符串,我需要在完成每个字符串时将它们从操作内存中完全删除,我不知道如何删除缓存的引用以便垃圾收集器可以从内存中删除所有字符串数据.如何防止字符串被嵌入此缓存中,或者如何清除它/或从中删除字符串以便它确实从操作内存中删除?

c# memory

11
推荐指数
2
解决办法
2535
查看次数