权衡 - 性能与空间 - 布尔值与字符串比较

问题描述 投票:0回答:2

我有一个用例,只有在有内容要显示时才显示模态弹出窗口。内容可在门户中配置。

  1. 检查内容是否不为空然后渲染模态弹出代码
    缺点 - 性能低:字符串检查成本高

  2. 引入一个新的位列并使其在门户中可配置以 指示是否需要显示模态弹出窗口。
    缺点 - 更多空间:用于存储值的附加列

您会推荐哪种方法,为什么?

c# performance database-design storage
2个回答
3
投票

你的问题前提不正确

检查

string.IsNullOrEmpty
实际上是一个非常便宜的操作,来源如下:

public static bool IsNullOrEmpty([NotNullWhen(false)] string? value)
{
    if ((object)value != null)
    {
        return value!.Length == 0;
    }
    return true;
}

我们可以通过以下基准证明这是一个快速操作:

[MemoryDiagnoser]
[ShortRunJob]
public class IsNullOrEmptyBenchmark
{
    private const string Input = "here is an input";

    [Benchmark(Baseline = true)]
    public bool IsNulLOrEmptyBenchmark()
    {
        var isNullOrEmpty = true;
        for (int i = 0; i < 1000; i++)
        {
            isNullOrEmpty = string.IsNullOrEmpty(Input);
        }

        return isNullOrEmpty;
    }
} 

在我的机器上,这个 1000 次迭代基准测试(带有后续分配)仅需要 338 ns(每个操作的三分之一纳秒,这基本上是一个空操作),

而且很可能与必须维护额外数据的成本相比相形见绌。此外,无论要执行模态的代码都将比此检查昂贵得多。


1
投票

对于 #1,您不是在客户端检查字符串,而是在查询中的服务器上进行检查 (

len(col) > 0
)。

对于#2,你在复制数据,这不仅空间效率低下,而且是一个非常明显的故障点。

就是说,如果您所做的只是显示一个模态对话框,那意味着您一开始就不能经常这样做。优化它是在浪费你的时间(虽然好的设计通常不是,#2 是糟糕的 RDMBS 设计的定义)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.