Skip to content

性能优化 tsc2ns #18

@ktprime

Description

@ktprime

是否考虑将base_ns_ , base_tsc_ 写入一个128位整数,下面这段
代码可能就不需要使用 param_seq_ 和 atomic_signal_fence。保证这两个数是原子读。saveParam 写入一样
ns_per_tsc_ 这个变量通常不会太大变化。

  inline int64_t tsc2ns(int64_t tsc) const {
    while (true) {
      uint32_t before_seq = param_seq_.load(std::memory_order_acquire) & ~1;
      std::atomic_signal_fence(std::memory_order_acq_rel);
      int64_t ns = base_ns_ + (int64_t)((tsc - base_tsc_) * ns_per_tsc_);
      std::atomic_signal_fence(std::memory_order_acq_rel);
      uint32_t after_seq = param_seq_.load(std::memory_order_acquire);
      if (before_seq == after_seq) return ns;
    }
  }

  int64_t tsc2ns(int64_t tsc) const {
        Int128 combined = combined_data_.load(std::memory_order_relaxed);
        int64_t base_ns, base_tsc;
        split(combined, base_ns, base_tsc);
        double ns_per_tsc = ns_per_tsc_.load(std::memory_order_relaxed);
        return base_ns + static_cast<int64_t>((tsc - base_tsc) * ns_per_tsc);
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions