相关疑难解决方法(0)

计算程序的速度?

确定处理例程所需的时间(例如函数的过程)最好和最准确的方法是什么?

我问,因为我目前正在尝试优化我的应用程序中的一些函数,当我测试更改时,如果有任何改进,只需通过查看就很难确定.因此,如果我能够返回一个准确或接近准确的处理例程的时间,那么我可以更清楚地了解代码是否有任何变化.

我考虑过使用GetTickCount,但我不确定这是否接近准确?

有一个可恢复的函数/过程来计算例程的时间是有用的,并使用它像这样:

// < prepare for calcuation of code
...
ExecuteSomeCode; // < code to test
...
// < stop calcuating code and return time it took to process
Run Code Online (Sandbox Code Playgroud)

我期待听到一些建议.

谢谢.

克雷格.

delphi optimization performance gettickcount

35
推荐指数
5
解决办法
6466
查看次数

为什么System.nanoTime()和System.currentTimeMillis()如此迅速地分开?

出于诊断目的,我希望能够在长时间运行的服务器应用程序中检测系统时钟的变化.由于System.currentTimeMillis()是基于挂钟时间并且System.nanoTime()基于挂钟时间独立(*)的系统计时器,我想我可以使用这些值之间的差异的变化来检测系统时间变化.

我写了一个快速测试应用程序,看看这些值之间的差异是多么稳定,令我惊讶的是,这些值在我每秒几毫秒的水平上立刻发散.有几次我看到了更快的分歧.这是在带有Java 6的Win7 64位桌面上.我没有在Linux(或Solaris或MacOS)下尝试过这个测试程序来查看它的执行情况.对于这个应用程序的一些运行,分歧是积极的,对于某些运行它是负面的.它似乎取决于桌面正在做什么,但很难说.

public class TimeTest {
  private static final int ONE_MILLION  = 1000000;
  private static final int HALF_MILLION =  499999;

  public static void main(String[] args) {
    long start = System.nanoTime();
    long base = System.currentTimeMillis() - (start / ONE_MILLION);

    while (true) {
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        // Don't care if we're interrupted
      }
      long now = System.nanoTime();
      long drift = System.currentTimeMillis() - (now / ONE_MILLION) - base;
      long interval = (now …
Run Code Online (Sandbox Code Playgroud)

java windows time datetime

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

使用背靠背rdtsc进行负时钟周期测量?

我正在编写一个C代码,用于测量获取信号量所需的时钟周期数.我正在使用rdtsc,在对信号量进行测量之前,我连续两次调用rdtsc来测量开销.我在for循环中重复了这么多次,然后我将平均值用作rdtsc开销.

这是正确的,首先要使用平均值吗?

尽管如此,这里的一个大问题是,有时我会得到开销的负值(不一定是平均值,但至少是for循环中的部分值).

这也影响了连续计算sem_wait()操作所需的cpu周期数,有时也证明是负数.如果我写的不清楚,这里有一部分我正在编写的代码.

为什么我会得到这样的负值?


(编者注:请参阅获取CPU周期计数?以获得完整的64位时间戳的正确和可移植方式."=A"编译为x86-64时,asm约束只能得到低或高32位,具体取决于寄存器分配是否发生为uint64_t输出选择RAX或RDX .它不会选择edx:eax.)

(编辑的第二个注释:哎呀,这就是为什么我们得到负面结果的答案.仍然值得留下一个注释作为警告,不要复制这个rdtsc实现.)


#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>

static inline uint64_t get_cycles()
{
  uint64_t t;
           // editor's note: "=A" is unsafe for this in x86-64
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}

int num_measures = 10;

int main ()
{
   int i, value, res1, res2;
   uint64_t c1, c2;
   int tsccost, tot, a;

   tot=0;    

   for(i=0; i<num_measures; i++)
   { …
Run Code Online (Sandbox Code Playgroud)

c x86-64 overhead inline-assembly rdtsc

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

CPU TSC获取操作,尤其是在多核多处理器环境中

在Linux世界中,要获得纳秒精度定时器/时钟提示,可以使用:

#include <sys/time.h>

int foo()
{
   timespec ts;

   clock_gettime(CLOCK_REALTIME, &ts); 
   //--snip--      
}
Run Code Online (Sandbox Code Playgroud)

这个答案提出了asm一种用RDTSC指令直接查询cpu时钟的方法.

在多核,多处理器架构中,这个时钟滴答/定时器值如何在多个内核/处理器之间同步?我的理解是,在固有的围栏中完成了.这种理解是否正确?

你能否提出一些可以详细解释这个问题的文件?我对Intel Nehalem和Sandy Bridge微体系结构感兴趣.

编辑

将进程限制为单个核心或cpu不是一种选择,因为该进程非常庞大(就消耗的资源而言)并且希望最佳地利用包含所有核心和处理器的机器中的所有资源.

编辑

感谢您确认TSC在核心和处理器之间同步.但我最初的问题是这种同步是如何完成的?它是否带有某种围栏?你知道任何公共文件吗?

结论

感谢所有输入:以下是此讨论的结论:TSC在初始化时使用在多处理器/多核系统中的核心和处理器之间发生的RESET进行同步.之后,每个Core都是独立的.TSC与锁相环保持不变,这将使频率变化正常化,从而使给定Core内的时钟变化正常化,这就是TSC在核心和处理器之间保持同步的方式.

c assembly multicore cpu-registers microprocessors

14
推荐指数
4
解决办法
7895
查看次数

如何计算CPU核心的频率

我试图使用RDTSC,但似乎我的方法可能是错误的获得核心速度:

#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

struct Core
{
    int CoreNumber;
};

static void startMonitoringCoreSpeeds(void *param)
{
    Core core = *((Core *)param);
    SetThreadAffinityMask(GetCurrentThread(), 1 << core.CoreNumber);
    while (true)
    {
        DWORD64 first = __rdtsc();
        Sleep(1000);
        DWORD64 second = __rdtsc();
        cout << "Core " << core.CoreNumber << " has frequency " << ((second - first)*pow(10, -6)) << " MHz" << endl;
    }
}

int GetNumberOfProcessorCores()
{
    DWORD process, system;
    if (GetProcessAffinityMask(GetCurrentProcess(), &process, &system))
    {
        int count …
Run Code Online (Sandbox Code Playgroud)

c++ performance winapi visual-c++ rdtsc

7
推荐指数
1
解决办法
2643
查看次数

用于基准测试和时间戳计数器频率的rdtsc的准确性

作为基准测试任务的一部分,我正在研究可用于测量经过时间的不同机制.我已经完成了使用clock_gettime,但我也做了充分的研究和测试RDTSC.我有几个相同的问题(基于我在几个在线线程上读到的内容):

  • 在较新的处理器(> Pentium 4)上,TSC以系统上CPU的最大频率进行计时.它是否正确?在这种情况下,使用滴答数和频率来确定时间是否有效?

  • 如果以上情况属实,则意味着TSC不受由于省电和其他功能导致的CPU频率变化的影响.知道这一点,是否意味着通过使用获得的总滴答数RDTSC不是采样的代码段使用的实际滴答 - 因为代码将以CPU的频率而不是TSC的频率运行?此外,这是否意味着使用TSC滴答获得的时间和CPU频率不是代码片使用的实际时间?

  • 我发现了许多关于跨核心同步TSC值的不同陈述(参见本篇文章).我不确定什么是正确的,我猜这也取决于处理器型号.但是可以假设它在新CPU的内核之间同步吗?(这是没有用的sched_set_affinity)?

请注意,RDTSC由于与之相关的各种问题(便携性,可靠性等),我没有使用.这些问题只是为了提高我对TSC如何工作以及一般基准测试的理解.

linux time assembly intel

5
推荐指数
1
解决办法
1150
查看次数

在x86内核中获取TSC速率

我有一个在Atom上运行的嵌入式Linux系统,这是一个足够新的CPU,具有不变的TSC(时间戳记计数器),内核在启动时测量其频率。我在自己的代码中使用TSC来节省时间(避免内核调用),而我的启动代码会测量TSC速率,但我只想使用内核的度量值。有什么办法可以从内核中检索到它吗?它不在/ proc / cpuinfo中。

linux-kernel tsc

5
推荐指数
2
解决办法
2094
查看次数

如何检测RDTSC是否返回恒定速率计数器值?

似乎AMD和英特尔最新的CPU都将rdtsc作为恒定速率计数器实现,避免了TurboBoost或省电设置等因频率变化引起的问题.

由于rdtsc比QueryPerformanceCounter更适合性能测量,因为它的开销要低得多,我想尽可能地使用它.

如果rdtsc是一个恒定速率计数器,我如何可靠地检测?

64-bit x86 profiling rdtsc

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