以对数 1、10、100、1000 等方式记录

本文关键字:1000 方式 记录 | 更新日期: 2023-09-27 18:34:22

有没有更有效的方法来完成以下操作,只是感觉有些不对劲? 我正在寻找最省时的对数记录方式。

    public bool Read()
    {
        long count = Interlocked.Increment(ref _count);
        switch (count)
        {
            case 1L:
            case 10L:
            case 100L:
            case 1000L:
            case 10000L:
            case 100000L:
            case 1000000L:
            case 10000000L:
            case 100000000L:
            case 1000000000L:
            case 10000000000L:
            case 100000000000L:
            case 1000000000000L:
            case 10000000000000L:
            case 100000000000000L:
            case 10000000000000000L:
            case 100000000000000000L:
            case 1000000000000000000L:
                _logger.LogFormattable(LogLevel.Debug, $"{count} Rows Read");
                break;
        }
        return _reader.Read();
    }

更新:

这是我的微基准测试。

  • 方法1:Übercoder的方式跟上状态
  • 方法2:我的方式与大开关语句
  • 方法3:Markus Weninger与漂亮的数学函数的方式

由于对我来说,在没有日志记录的情况下读取 100,000,000 条记录大约需要 20 分钟,那么额外的 4 秒就不算什么了。 我要用美丽的数学做事方式。 Mathod3在我的场景中获胜。

Run time for 100,000,000 iterations averaged over 100 attempts
Method1 Max: 00:00:00.3253789
Method1 Min: 00:00:00.2261253
Method1 Avg: 00:00:00.2417223
Method2 Max: 00:00:00.5295368
Method2 Min: 00:00:00.3618406
Method2 Avg: 00:00:00.3904475
Method3 Max: 00:00:04.0637217
Method3 Min: 00:00:03.2023237
Method3 Avg: 00:00:03.3979303

以对数 1、10、100、1000 等方式记录

如果性能不是一个大问题,我会使用以下方法

if(Math.Log10(count) % 1 == 0)
  _logger.LogFormattable(LogLevel.Debug, $"{count} Rows Read");

此问题陈述如下:

对于浮点数,n % 1 == 0 通常是检查是否有任何超过小数点的方法。


编辑:为了完成我的答案,还可以跟踪下一个日志记录值,正如@Übercoder在他的答案中发布的那样。

long nextLoggingValueForLogX = 1;
if (count == nextLoggingValueForLogX )
{
   nextLoggingValueForLogX *= 10; // Increase it by your needs, e.g., logarithmically by multiplying with 10
   _logger.LogFormattable(LogLevel.Debug, $"{count} Rows Read");
}

然而,此方法将为每个日志提供一个不应每次执行的新变量。这将引入额外的代码,如果必须使其是线程安全的,也会引入额外的工作。

static long logTrigger = 1;

if (count == logTrigger)
{
   logTrigger *= 10;
   // do your logging
}