WMI를 사용하여 CPU 캐시 정보를 얻으려고 시도했지만 정상적으로 작동하지만 레벨 2 및 레벨 3 캐시에서만 작동하므로 CPU 레벨 1 캐시 정보를 얻는 방법은 무엇입니까?CPU 레벨 1 캐시 (1 차 캐시) 정보를 얻는 방법?
답변
당신은 Win32_CacheMemory
WMI 클래스를 사용할 수 있습니다,이 코드를 시도 :
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants;
procedure GetWin32_CacheMemoryInfo;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery('SELECT MaxCacheSize, Purpose FROM Win32_CacheMemory','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Writeln(Format('MaxCacheSize %d',[Integer(FWbemObject.MaxCacheSize)]));
Writeln(Format('Purpose %s',[String(FWbemObject.Purpose)]));
FWbemObject:=Unassigned;
end;
end;
begin
try
CoInitialize(nil);
try
GetWin32_CacheMemoryInfo;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
감사합니다. GetWin32_ProcessorInfo를 사용했지만 GetWin32_CacheMemory;를 다시 사용합니다. –
@RRUZ Win32 API를 사용하는 접근 방식에이 솔루션을 선호 할만한 이유가 있습니까? –
@RRUZ LEVEL1 만받는 방법? CacheMemoryInfo는 모든 레벨 캐시 크기를 표시합니다. 감사. –
가 여기에 GetLogicalProcessorInformation
기능을 사용하는 WinAPI를의 방법입니다.
type
TLogicalProcessorRelationship = (
RelationProcessorCore = 0,
RelationNumaNode = 1,
RelationCache = 2,
RelationProcessorPackage = 3,
RelationGroup = 4,
RelationAll = $FFFF
);
TProcessorCacheType = (
CacheUnified,
CacheInstruction,
CacheData,
CacheTrace
);
TCacheDescriptor = record
Level: Byte;
Associativity: Byte;
LineSize: Word;
Size: DWORD;
pcType: TProcessorCacheType;
end;
PSystemLogicalProcessorInformation = ^TSystemLogicalProcessorInformation;
TSystemLogicalProcessorInformation = record
ProcessorMask: ULONG_PTR;
Relationship: TLogicalProcessorRelationship;
case Integer of
0: (Flags: Byte);
1: (NodeNumber: DWORD);
2: (Cache: TCacheDescriptor);
3: (Reserved: array [0..1] of ULONGLONG);
end;
function GetLogicalProcessorInformation(
Buffer: PSystemLogicalProcessorInformation;
var ReturnLength: DWORD): BOOL; stdcall;
external kernel32 name 'GetLogicalProcessorInformation';
그리고 모든 레벨 1에 대한 캐시 유형, 수준과 크기를 표시하는 방법의 예 : 당신이 적어도 델파이 XE2이있는 경우 그들은 Windows
단위로 이미, 다음과 같은 정의가 필요하지 않습니다 캐시 항목 :
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
ReturnLength: DWORD;
Buffer: array of TSystemLogicalProcessorInformation;
begin
SetLength(Buffer, 1);
if not GetLogicalProcessorInformation(@Buffer[0], ReturnLength) then
begin
if GetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
SetLength(Buffer,
ReturnLength div SizeOf(TSystemLogicalProcessorInformation) + 1);
if not GetLogicalProcessorInformation(@Buffer[0], ReturnLength) then
RaiseLastOSError;
end
else
RaiseLastOSError;
end;
for I := 0 to High(Buffer) do
begin
if (Buffer[I].Relationship = RelationCache) and
(Buffer[I].Cache.Level = 1) then
begin
S := 'Type: ';
case Buffer[I].Cache.pcType of
CacheUnified: S := S + 'Unified cache';
CacheInstruction: S := S + 'Instruction cache';
CacheData: S := S + 'Data cache';
CacheTrace: S := S + 'Trace cache';
end;
S := S + sLineBreak;
S := S + 'Level: ' + IntToStr(Buffer[I].Cache.Level) + sLineBreak;
S := S + 'Size: ' + IntToStr(Buffer[I].Cache.Size) + ' B';
ShowMessage(S);
end;
end;
end;
+1 이것이 Delphi에서 올바른 방법입니다. Windows.pas는 GetLogicalProcessorInformation과 필요한 다양한 유형을 정의합니다. 적어도 XE3에서는 그렇습니다. 내가 언제 추가되었는지는 잘 모르겠다. –
@David는 XE가 아니라 XE2에 있습니다. –
@LURD, 정보 주셔서 감사합니다! 게시물에 포함시켜 드리겠습니다 ... – TLama
- 1. Hibernate의 2 차 레벨 캐시?
- 2. Java 2 레벨 캐시
- 3. NHibernate : 2 차 레벨 캐시 만기
- 4. 외부 업데이트가있는 NHibernate 2 차 레벨 캐시
- 5. 소프트 삭제시 최대 절전 모드 2 차 레벨 캐시
- 6. jpa에서 2 차 캐시 용 XML에서 캐시 가능을 정의하는 방법
- 7. 최대 절전 모드 2 차 캐시 업데이트
- 8. NHibernate 2.1.1.4000에 대한 NHibernate 2 차 레벨 캐시 제공자
- 9. 최대 절전 모드 2 차 레벨 캐시 문제
- 10. Nhibernate 및 SetCacheable (2 차 레벨 캐시 포함)
- 11. JBoss 4.2에서 JPA로 Hibernate 2 차 레벨 캐시 활성화
- 12. 1 차 미분 방정식을 1 차 공식으로 인코딩
- 13. CPU 캐시 무효화
- 14. 프로그래밍 가능한 CPU 캐시?
- 15. NHibernate 2 차 레벨 캐시를 지우는 방법
- 16. 1 시간 동안 PHP 캐시 XML 파일
- 17. 멀티 도메인 용 캐시 1 파일
- 18. 안드로이드에서 캐시 크기를 얻는 방법
- 19. 1 차 및 2 차 목표
- 20. 1 차 및 2 차 카메라 토글
- 21. cakePHP에서 1 페이지가 캐시 될 때 가장 좋은 방법
- 22. 1 차 로직을 CNF로 변환
- 23. 안드로이드는 1 차 결과를 얻을
- 24. ActiveRecordBase.FindAll()은 1 차 캐시를 허용하지 않습니까?
- 25. NHibernate 2 차 레벨 캐시에서 객체 제거
- 26. 하늘 캐싱에 캐시 된 항목에 대한 정보를 얻는 방법?
- 27. NHibernate에 쿼리 및 제 2 레벨 캐시
- 28. 최대 절전 모드 2 차 캐시
- 29. Grails를/GORM 안 첫 번째 레벨 캐시
- 30. 캐시 된 정보를 플러그인으로 저장하는 방법
'GetLogicalProcessorInformation' 및'GetLogicalProcessorInformationEx'에 대한 기본 API가 있습니다. WMI는 과도한 것처럼 보입니다. –