- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试用 C++ 重新创建 Windows Reg.exe 实用程序。具体来说,在 REG.exe 中完成以下命令所带来的功能。
REG QUERY "HKLM\Software" /s
但是,当我将结果输出到屏幕时,我似乎遇到了严重的瓶颈。
如果我注释掉 std::wcout << fPath.c_str()
, 该程序在 1.45 分钟内完成,而不是在 20 多分钟内完成评论。
我想知道为什么会这样,我该如何解决。
inline void show(HKEY aHkey, std::wstring aHkeyPath, std::wstring aSubKey, RegValue &aValueData, bool aDisplayPath, bool aDisplayValue, bool aLastItem)
{
if (aDisplayValue)
{
// Show registry value name
std::wstring lValueName = (aValueData.lValueName);
if (lValueName == TEXT("")) lValueName = TEXT("(Default)");
// Recover from non ascii characters
if (!std::wcout.good())
{
std::wcout.clear();
}
// Show registry type
std::wstring lDataType = convertToWstr(getDataTypeStringName(aValueData.lRegType));
std::wstring lDataValue;
// Show registry data
if (lDataType == L"REG_DWORD" ||
lDataType == L"REG_QWORD" ||
lDataType == L"REG_DWORD_LITTLE_ENDIAN" ||
lDataType == L"REG_QWORD_LITTLE_ENDIAN" ||
lDataType == L"REG_DWORD_BIG_ENDIAN")
{
lDataValue = L"0x0" + (aValueData.lDataValue);
}
else
{
lDataValue = (aValueData.lDataValue);
}
std::wstring fPath = lValueName + L" " + lDataType + L" " + lDataValue;
std::wcout << fPath.c_str();
}
std::cout << "\n";
}
注册值结构
struct RegValue
{
std::wstring lValueName;
unsigned int lRegType;
std::wstring lDataValue;
};
主体调用函数
RegValue lRegValueData;
std::wstring lCurrentSubKey = L"";
std::wstring lCurrentValue = L"";
unsigned int lMatchTotal = 0;
// HACK: Makes sure that lSubKeyList loop will be entered even if there is no sub keys
// Additionally, allows for the last subkey within the dequeue to be shown
lSubKeyList.push_back(L"End");
while (lSubKeyList.size())
{
//show(hkey, lHkeyPath, lCurrentSubKey, lRegValueData, true, false, false);
while (lValueList.size())
{
lCurrentValue = lValueList.front();
lValueList.pop();
lResult = getValueData(hkey, lHkeyPath, lCurrentSubKey, lCurrentValue, lRegValueData);
if (lResult != ERROR_SUCCESS)
{
error(lResult);
return false;
}
if (lFind || lFilterDataType)
{
bool lMatch = isMatch(lRegValueData, aVal.lDataType, lSearchParam);
if (lMatch)
{
show(hkey, lHkeyPath, lCurrentSubKey, lRegValueData, false, true, false);
lMatchTotal++;
}
}
else
{
show(hkey, lHkeyPath, lCurrentSubKey, lRegValueData, false, true, false);
}
//Create a space after last data value
if (lValueList.size() == 0 && !lSearchRecursive)
{
std::cout << "\n";
}
}
// Remove visted Sub-Key from deque
lCurrentSubKey = lSubKeyList.front();
lSubKeyList.pop_front();
if (lSearchRecursive && lCurrentSubKey != L"End")
{
//Create a space after the first key.
std::cout << "\n";
// If the parent key contains sub-keys, add them to lSubKeyList,
// in the order they were retrieved from RegEnumEx.
std::deque<std::wstring> lTemp;
lResult = getSubKeyList(hkey, lHkeyPath, lCurrentSubKey, lTemp);
while (lTemp.size())
{
lSubKeyList.push_front(lTemp.back());
lTemp.pop_back();
}
// A non-error. Error: "Invalid Handle"
// This error code just states that the current key being accessed
// does not contain any sub-keys.
if (lResult == 6) lResult = 0;
if (lResult != ERROR_SUCCESS)
{
error(lResult);
return false;
}
// Get the current keys value names
lResult = getValueNameList(hkey, lHkeyPath, lCurrentSubKey, lValueList);
// Ignore key values that cannot be accessed. Error "Access Denied"
// Keys cannot be accessed in regedit (admin), so this is a UAC issue.
if (lResult == 5) lResult = 0;
if (lResult != ERROR_SUCCESS)
{
error(lResult);
return false;
}
}
}
反汇编代码 (std::wcout << fPath.c_str())
std::wcout << fPath.c_str();
00007FF67E5759E3 lea rdx,[rbp]
00007FF67E5759E7 cmp qword ptr [rbp+18h],8
00007FF67E5759EC cmovae rdx,qword ptr [rbp]
00007FF67E5759F1 mov rcx,qword ptr [__imp_std::wcout (07FF67E57D140h)]
00007FF67E5759F8 call std::operator<<<wchar_t,std::char_traits<wchar_t> > (07FF67E577CE0h)
00007FF67E5759FD nop
}
00007FF67E5759FE mov rax,qword ptr [rbp+18h]
00007FF67E575A02 cmp rax,8
00007FF67E575A06 jb show+4B8h (07FF67E575A68h)
00007FF67E575A08 inc rax
00007FF67E575A0B mov rcx,qword ptr [rbp]
00007FF67E575A0F cmp rax,r13
00007FF67E575A12 jbe show+46Bh (07FF67E575A1Bh)
00007FF67E575A14 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575A1A int 3
00007FF67E575A1B add rax,rax
00007FF67E575A1E cmp rax,1000h
00007FF67E575A24 jb show+4B3h (07FF67E575A63h)
00007FF67E575A26 test byte ptr [rbp],1Fh
00007FF67E575A2A je show+483h (07FF67E575A33h)
00007FF67E575A2C call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575A32 int 3
00007FF67E575A33 mov rax,qword ptr [rcx-8]
00007FF67E575A37 cmp rax,rcx
00007FF67E575A3A jb show+493h (07FF67E575A43h)
00007FF67E575A3C call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575A42 int 3
00007FF67E575A43 sub rcx,rax
00007FF67E575A46 cmp rcx,8
00007FF67E575A4A jae show+4A3h (07FF67E575A53h)
00007FF67E575A4C call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575A52 int 3
00007FF67E575A53 cmp rcx,27h
00007FF67E575A57 jbe show+4B0h (07FF67E575A60h)
00007FF67E575A59 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575A5F int 3
00007FF67E575A60 mov rcx,rax
00007FF67E575A63 call operator delete (07FF67E57B430h)
00007FF67E575A68 mov qword ptr [rbp+18h],7
00007FF67E575A70 mov qword ptr [rbp+10h],r12
00007FF67E575A74 mov word ptr [rbp],r12w
00007FF67E575A79 mov rax,qword ptr [rbp-28h]
00007FF67E575A7D cmp rax,8
00007FF67E575A81 jb show+533h (07FF67E575AE3h)
00007FF67E575A83 inc rax
00007FF67E575A86 mov rcx,qword ptr [rbp-40h]
00007FF67E575A8A cmp rax,r13
00007FF67E575A8D jbe show+4E6h (07FF67E575A96h)
00007FF67E575A8F call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575A95 int 3
00007FF67E575A96 add rax,rax
00007FF67E575A99 cmp rax,1000h
00007FF67E575A9F jb show+52Eh (07FF67E575ADEh)
00007FF67E575AA1 test byte ptr [rbp-40h],1Fh
00007FF67E575AA5 je show+4FEh (07FF67E575AAEh)
00007FF67E575AA7 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575AAD int 3
00007FF67E575AAE mov rax,qword ptr [rcx-8]
00007FF67E575AB2 cmp rax,rcx
00007FF67E575AB5 jb show+50Eh (07FF67E575ABEh)
00007FF67E575AB7 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575ABD int 3
00007FF67E575ABE sub rcx,rax
00007FF67E575AC1 cmp rcx,8
00007FF67E575AC5 jae show+51Eh (07FF67E575ACEh)
00007FF67E575AC7 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
}
00007FF67E575ACD int 3
00007FF67E575ACE cmp rcx,27h
00007FF67E575AD2 jbe show+52Bh (07FF67E575ADBh)
00007FF67E575AD4 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575ADA int 3
00007FF67E575ADB mov rcx,rax
00007FF67E575ADE call operator delete (07FF67E57B430h)
00007FF67E575AE3 mov qword ptr [rbp-28h],7
00007FF67E575AEB mov qword ptr [rbp-30h],r12
00007FF67E575AEF mov word ptr [rbp-40h],r12w
00007FF67E575AF4 mov rax,qword ptr [rbp-48h]
00007FF67E575AF8 cmp rax,8
00007FF67E575AFC jb show+5AEh (07FF67E575B5Eh)
00007FF67E575AFE inc rax
00007FF67E575B01 mov rcx,qword ptr [rbp-60h]
00007FF67E575B05 cmp rax,r13
00007FF67E575B08 jbe show+561h (07FF67E575B11h)
00007FF67E575B0A call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575B10 int 3
00007FF67E575B11 add rax,rax
00007FF67E575B14 cmp rax,1000h
00007FF67E575B1A jb show+5A9h (07FF67E575B59h)
00007FF67E575B1C test byte ptr [rbp-60h],1Fh
00007FF67E575B20 je show+579h (07FF67E575B29h)
00007FF67E575B22 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575B28 int 3
00007FF67E575B29 mov rax,qword ptr [rcx-8]
00007FF67E575B2D cmp rax,rcx
00007FF67E575B30 jb show+589h (07FF67E575B39h)
00007FF67E575B32 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575B38 int 3
00007FF67E575B39 sub rcx,rax
00007FF67E575B3C cmp rcx,8
00007FF67E575B40 jae show+599h (07FF67E575B49h)
00007FF67E575B42 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575B48 int 3
00007FF67E575B49 cmp rcx,27h
00007FF67E575B4D jbe show+5A6h (07FF67E575B56h)
00007FF67E575B4F call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575B55 int 3
00007FF67E575B56 mov rcx,rax
00007FF67E575B59 call operator delete (07FF67E57B430h)
00007FF67E575B5E mov qword ptr [rbp-48h],7
00007FF67E575B66 mov qword ptr [rbp-50h],r12
00007FF67E575B6A mov word ptr [rbp-60h],r12w
00007FF67E575B6F mov rax,qword ptr [rbp-8]
00007FF67E575B73 cmp rax,8
00007FF67E575B77 jb show+629h (07FF67E575BD9h)
00007FF67E575B79 inc rax
00007FF67E575B7C mov rcx,qword ptr [rbp-20h]
00007FF67E575B80 cmp rax,r13
00007FF67E575B83 jbe show+5DCh (07FF67E575B8Ch)
00007FF67E575B85 call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575B8B int 3
00007FF67E575B8C add rax,rax
00007FF67E575B8F cmp rax,1000h
00007FF67E575B95 jb show+624h (07FF67E575BD4h)
00007FF67E575B97 test byte ptr [rbp-20h],1Fh
00007FF67E575B9B je show+5F4h (07FF67E575BA4h)
00007FF67E575B9D call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575BA3 int 3
00007FF67E575BA4 mov rax,qword ptr [rcx-8]
00007FF67E575BA8 cmp rax,rcx
00007FF67E575BAB jb show+604h (07FF67E575BB4h)
00007FF67E575BAD call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575BB3 int 3
00007FF67E575BB4 sub rcx,rax
00007FF67E575BB7 cmp rcx,8
00007FF67E575BBB jae show+614h (07FF67E575BC4h)
00007FF67E575BBD call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575BC3 int 3
00007FF67E575BC4 cmp rcx,27h
00007FF67E575BC8 jbe show+621h (07FF67E575BD1h)
00007FF67E575BCA call qword ptr [__imp__invalid_parameter_noinfo_noreturn (07FF67E57D318h)]
00007FF67E575BD0 int 3
00007FF67E575BD1 mov rcx,rax
00007FF67E575BD4 call operator delete (07FF67E57B430h)
最佳答案
控制台窗口的输出速度很慢,因为需要进行大量滚动(在文本缓冲区和屏幕上)。您可以将程序输出重定向到一个文件,性能应该与没有输出的版本相似。
不过,要进一步减少运行所需的时间,您需要尽可能减少字符串的使用。与其使用一系列 +
字符串操作(使用 3 个临时字符串对象),不如创建一个空字符串,在其中为整个构造的字符串保留足够的空间,然后使用 +=
添加单个组件。将其设为静态变量以避免额外的内存分配,并且仅在需要更多空间时才调整其大小。
关于c++ - 使用 std::wcout 会降低奇怪的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51344666/
我在堆栈上创建了这段代码: function increase_brightness(hex, percent){ var r = parseInt(hex.substr(1, 2), 16)
为什么我能够LOWER COALESCE 中的每个项目,但无法LOWER整个COALESCE,否则我会遇到语法错误?例如: SELECT COALESCE(LOWER(google_provider_
我在谷歌上搜索到的所有内容都表明,以下任何一项都会将 double 舍入到小数点后两位。 double roundToFourDecimals(double d) { DecimalForma
我正在开发一个 flexdashboard/storyboard,我想在其中降低每个帧的高度。那可能吗? 示例代码: --- title: "Flex" output: flexdashboard
我在 WPF 中有一个图像控件。我需要减小图像尺寸控件的宽度和高度。但是当我这样做时,图像看起来不太好。数据丢失更多。 所以我想降低图像分辨率而不是仅仅改变图像控件的宽度和高度。 任何人都可以帮助我如
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
我正在扩展 Fluent NHibernate,以便更好地与 F# 一起使用(即引用支持),并希望获得一些关于降低 API 流畅性的反馈。 F# 要求使用返回值,除非它们是单位类型。所以这最终以“|>
我们有一个 BizTalk 2010 接收位置,它将获取一个 70MB 的文件,然后使用入站映射(在接收位置)和出站映射(在发送端口)生成一个 1GB 文件。 执行上述过程时,SQL Server 会
我的代码分析插件提示包含以下代码的方法中的代码复杂性。我注意到以下代码看起来可以组合,但我不知道如何做到这一点: for(Command command : commands) { if (c
我正在寻找一种方法来始终忽略 R 中 float 之间的微小差异(根据 IEC 60559,这些是 double 浮点),通过使用基本 R 工具而不诉诸 C 或 C++。换句话说,我想“四舍五入” d
在 Blazor 中使用 ChartJs.Blazor 的 BarChart 组件时是否可以降低甚至关闭动画速度?我发现这个 NuGet 包非常有用,但我不知道如何在更新条形图时关闭动画。为了更容易忽
所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。 我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗? 所以我为一个
我正在编写一个程序,我担心它运行所需的时间和所占用的空间。 在程序中我使用了一个变量来存储数组的长度: int len=newarray3.length; 现在,我想知道是否能够通过不使用 len 变
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我用Java编写了一个程序,但它的计算时间很长,我不知道为什么。有人可以指点一下以降低复杂性吗?此外,在计算一些值(例如 3,100 之后)后,它会给出空指针异常。代码: public class F
我有下图,由 1 行 2 列的网格组成。我愿意 降低右侧子图的高度(3D PREDICTION),使棋盘平面看起来有点挤压并显示更好的视角。 在左侧子图的顶部添加一些边距(2D PREDICTION)
是否有一种简单的方法可以更改以 RGB 字符串形式给出的颜色的亮度? 例如 in_RGB = '#FF0000' --> out_RGB = '#CC0000' 最佳答案 将十六进制字符串转换为 R
我已经编写了代码来更改对象(不是进程)(在本例中是文件)的完整性级别。据我们所知,我们从中等完整性级别开始,但我想将其降低到“低”。我想运行完整性较低的 .txt 文件而不是默认介质。 我使用 WIN
是否可以在保持原始宽高不变的情况下降低图像分辨率? 我已经使用 BitmapFactoryOptions 尝试了几个选项: 在样本大小 inDensity、inScaled、inTargetDensi
是否有高级(Java)或低级方式(使用 native 代码)将 Android 设备上的蓝牙信号强度更改为最低? 目标是使设备在 20 厘米范围内可被发现?在 Internet 上根本找不到与此相关的
我是一名优秀的程序员,十分优秀!