2015-02-08 55 views
-1

我正在將handmadehero.org項目的C代碼翻譯成Delphi代碼。我遇到了一個性能問題在一段特定的:調用函數的速度Delphi vs C++

原文:

inline real32 
Win32GetSecondsElapsed(LARGE_INTEGER Start, LARGE_INTEGER End) 
{ 
    real32 Result = ((real32)(End.QuadPart - Start.QuadPart)/
        (real32)GlobalPerfCountFrequency); 
    return(Result); 
} 

我的版本:

function Win32GetSecondsElapsed(Start, &End : LARGE_INTEGER): real32; inline; 
begin 
Result := (&End.QuadPart - Start.QuadPart)/GlobalPerfCountFrequency; 
end; 

調用休眠功能後有這個代碼,以確保我們打目標幀率:

SleepMilliSeconds = <some code that calcs how long to wait to hit target frame rate> 
Sleep(SleepMilliSeconds); 
real32 TestSecondsElapsedForFrame = Win32GetSecondsElapsed(LastCounter, Win32GetWallClock()); 
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame); 

如果我使用相同的代碼(只有它是德爾福版本),我g等一個斷言錯誤。

如果我更改代碼這樣:

TestSecondsElapsedForFrame := ((LastCounter.QuadPart - Win32GetWallClock().QuadPart)/GlobalPerfCountFrequency); 
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame); 

錯誤消失,因此呼叫Delphi中的功能需要足夠長的時間來把我推在允許的睡眠完成的時間。 有誰知道我該如何解決這個問題? 我已經嘗試更改Win32GetSecondsElapsed中的參數作爲指針傳遞,但它沒有幫助。 我認爲這可能是因爲它被價值傳遞,需要複製一份,但事實並非如此。 我認爲'inline'指令沒有生效。

我相信Delphi應用程序應該可以像C應用程序一樣快。

+0

調用一個函數不應該花費太多時間,但大概在這種情況下會出現問題。你必須檢查生成的代碼來確定什麼/爲什麼。 – 2015-02-08 09:46:56

+0

請注意,在這種情況下「調用函數」並不重要。既然「endtime」在兩種情況下都被當作一個論點! – 2015-02-08 09:57:14

+0

我不認爲在遊戲應用程序中入睡是明智的。每次應用程序到達計算/繪製下一幀的點時,它都應該計算自上次調用後應計算的幀數。然後計算所有這些,只畫最後一個。有時它只是一個NOP調用,有時你必須計算一些幀,這取決於當前的系統狀態。 – 2015-02-08 13:53:49

回答

1

此函數調用不會導致任何性能問題 - 問題出現在代碼的完全不同的部分。

你傳遞Win32GetWallClock()End,和LastCounter作爲Start,所以函數正確計算

Win32GetWallClock().QuadPart - LastCounter.QuadPart 

但在線版本計算

LastCounter.QuadPart - Win32GetWallClock().QuadPart 

是零或負數。

+0

我想我明白你在說什麼,我會立即檢查並報告。 – Maudrid 2015-02-08 10:38:45

+0

我現在解決了這個問題,甚至內聯代碼現在導致assert錯誤,所以你是正確的,它不是導致問題的函數調用。 – Maudrid 2015-02-08 10:46:31