照片马赛克算法。如何在给定的基本图像和瓷砖列表中创建一个马赛克照片?
hy.我要做的是创建一个程序(使用C或C ++),该程序作为输入24bits/Pixel位图和图像的收集,我必须创建一个镶嵌图像,类似于输入图像使用给定的图像库(创建类似于输入的镶嵌照片). 到目前为止,我可以访问输入的图像像素及其颜色,但我有点卡住.我的问题是我应该从哪里开始?我需要一种可以做这种事情的基本算法.而且我找不到任何东西(也许我看上去错了).而且有人可以告诉我一个随机的照片下载器,以便我可以为该项目下载小图像吗?有人能帮我吗?请告诉我从哪里开始和使用什么. 解决方案 我已经在Scala中完成了此操作. 示例图像: 这是我的基本算法: def createMosaic(targetImage:BufferedImage, index:PhotoIndexer.PhotoIndex, opacity:Float, targetWidth:Int, targetHeight:Int, numRows:Int, numColumns
2 2023-05-25
编程技术问答社区
如何从命令行编译一个MSVC项目中的单个源文件?
我将开始对我们的构建进行一些基准测试/测试,我想从命令行驱动整个东西.我知道DevEnv,但不相信它可以做我想做的事. 如果我可以在一个项目中构建一个文件,我会很高兴. 可以做到吗? 解决方案 魔咒如下.请注意,这仅通过VS 2010进行了测试 - 我听说这是具有此功能的Visual Studio的第一个版本: 咒语 其中 msbuild是通往MSBuild.exe的途径.通常,这应该由VS2010 bat文件为您设置,以便正确的文件最终会进入您的PATH,但如果不是,我在C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe 上找到了一个文件. project是vcxproj文件所在的文件的途径. settings包括以下内容: /p:Configuration="Debug"//或您的配置是 /p
0 2023-05-24
编程技术问答社区
从性能上看,使用'nullptr'还是直接使用'0'更快?
例如: object* pObject = nullptr; 或: object* pObject = 0; 再次,哪个更好的表现? 解决方案 nullptr是类型std::nullptr_t,因此构造函数被超载.这意味着将其编码为null的事实,因此可以通过避免有条件的速度来更快. 指针显然没有超载的构造函数,因此您是否使用0或nullptr是无关紧要的.相同的机器代码,相同的性能. 无论如何,使用nullptr当您想要空指针时.要小心0,因为它称为整数超载而不是指针. 其他解决方案 它们完全一样.文字0可用于初始化指针的事实纯粹是语言语法的一部分,并由编译器处理.结果与使用nullptr初始化指针相同:您获得了一个空指针. nullptr是类型系统的一部分,与生成的机器代码无关. (它存在,因此有一个具有指针类型的文字,但不存在.) 其他解决方案 我假设您是指std :: string. 我也假设您打算键入strin
0 2023-05-24
编程技术问答社区
为什么在Visual Studio编译期间,某些资源不超过100%?
我正在用Visual Studio编译大约100个C ++项目的大型解决方案.在汇编过程中,内存,CPU,磁盘和以太网均未将其用于100%接近的任何位置(根据"任务管理器性能"选项卡. CPU通常低至25%,内存磁盘利用率似乎低至5-10%. 因此,如果没有100%以100%的资源利用,那么瓶颈是什么?是什么限制了我的编译速度?老实说,我期望它是CPU.但这似乎不是. 我也许是错误地测量的吗?编译时,我应该期望有什么限制资源?我该如何加快速度?如果还有其他限制的东西(例如RAM,但像I/O通过缓存或其他内容一样),那么测量瓶颈的正确工具/方法是什么? 附加信息:我肯定使用构建的最大并行项目 = 8.所有视觉C ++项目.我的机器有8个逻辑处理器.因此,我真的认为我不仅仅是最大化一个核心.这将是我的机器上的12.5%使用情况(我经常看到单线程应用程序.) ) 解决方案 好的内存,也许您的应用程序不使用太多的内存. ,至于CPU使用情况,您的程序可能正在处理
10 2023-05-24
编程技术问答社区
使用MS编译器的std::cout极其缓慢
我正在打印计算的许多迭代的进度,并且输出实际上是其中最慢的部分,但是只有当我使用Visual C ++编译器时,MINGW才能在同一系统上工作正常. 考虑以下代码: #include #include using namespace std; #define TO_SEC(Time) \ chrono::duration_cast >(Time).count(); const int REPEATS = 100000; int main() { auto start_time = chrono::steady_clock::now(); for (int i = 1; i
0 2023-05-23
编程技术问答社区
了解为什么ASM FSQRT实现比标准SQRT函数更快
出于学术目的,我已经在C ++中使用基本的数学功能实现了.今天,我对平方根进行了以下代码: inline float sqrt_new(float n) { __asm { fld n fsqrt } } 我很惊讶地看到它始终比标准sqrt函数快(它占标准函数的执行时间的85%). 我不完全明白为什么,并且很想更好地理解它.在下面,我显示了我用于配置文件的完整代码(在Visual Studio 2015中,以发布模式进行编译,并在所有优化的情况下打开): #include #include #include #define M 1000000 float ranfloats[M]; using namespace std; inline float sqrt_new(float n) { __asm { fld n
0 2023-05-23
编程技术问答社区
在VS2013上测量vector<unique_ptr>的性能?
tl; dr VS2013的优化器是否感到困惑,还是我的测量结果错误,或者全局假人实际上需要挥发以使测试有效或____? 免责声明:这主要来自"学术"兴趣,我不会期望我看到的差异确实会影响任何生产代码. 介绍:我最近的一些测量结果将我带到这个问题因为我在VS2013上看到了std::vector >和boost::ptr_vector之间的显着差异. (另请参见评论在那里) 对于我的特定测试用例,在Boost :: Ptr_Vector中访问元素的速度比使用simel_ptr! 快50%. 我的测试代码在这里://27DC2F1B91380CCA (我还将其避免在此问题中,我将在下面包含摘要) ) gcc 4.8没有报告任何差异,所以这是VS2013的事情. Start... The timings are as follows for accessing all (1000000) elements 200 ti
0 2023-05-23
编程技术问答社区
C++代码的执行时间随着小的源码变化而变化,不应该引入任何额外的工作
在制定一些代码的基准测试时,我发现它的执行时间甚至会随着最无害的代码更改而变化. 我试图将下面的代码归结为最小的测试用例,但仍然很漫长(我深表歉意).更改几乎任何事物都在很大程度上影响基准结果. #include #include #include #include #include #include constexpr double usec_to_sec = 1000000.0; // Simple convenience timer class Timer { std::chrono::high_resolution_clock::time_point start_time; public: Timer() : start_time(std::chrono::high_resolution_clock::now()) { }
0 2023-05-23
编程技术问答社区
当改变完全不相关的代码时,Visual Studio C++编译器生成的代码速度要慢3倍
我有一个嵌套的循环,该循环生成以下组件: # branch target labels manually added for readability 002E20F8 mov ebx,esi 002E20FA mov dword ptr [ebp-10h],3B9ACA00h 002E2101 sub ebx,edi 002E2103 add ebx,7 002E2106 shr ebx,3 002E2109 nop dword ptr [eax] outer_loop: 002E2110 xor eax,eax 002E2112 xor ecx,ecx 002E2114 cmp edi,esi 002E2116 mov edx,ebx 002E2118 cm
0 2023-05-23
编程技术问答社区
如何计算CPU核心的频率
我正在尝试使用rdtsc,但是获得核心速度似乎是错误的: #include "stdafx.h" #include #include #include using namespace std; struct Core { int CoreNumber; }; static void startMonitoringCoreSpeeds(void *param) { Core core = *((Core *)param); SetThreadAffinityMask(GetCurrentThread(), 1
2 2023-05-23
编程技术问答社区
如何使MSVC的调试构建运行得更快
我们有一个大型的C ++应用程序,有时我们需要作为调试构建运行,以调查错误.调试构建比发行版本要慢得多,以至于几乎无法使用. 有哪些技巧可用于使MSVC调试构建更快地执行执行速度,而无需在可辩论性上牺牲太多? 解决方案 在您要在版本中调试的选定文件的顶部使用#pragma optimize("", off).这给出了更好的堆栈跟踪/变量视图. 如果您只需要几个文件来追逐错误. 其他解决方案 为什么不在发布配置中打开调试信息? 其他解决方案 我们关闭了使用预处理器符号的迭代器调试: _HAS_ITERATOR_DEBUGGING=0 _SCL_SECURE=0 它有所帮助,但仍然没有我们想要的那么快.我们最终还通过定义ndebug而不是_debug,使我们的调试构建更类似于发行.我们还有其他几个选择,但我不记得它们. 不幸的是,我们需要做所有这一切,但是我们的应用程序需要每50ms或无法使用的是一定数量的工作.开箱即用的VS2008将为我
0 2023-05-23
编程技术问答社区
为什么floor()这么慢?
我最近编写了一些代码(ISO/ANSI C),并为其表现不佳而感到惊讶.长话短说,事实证明罪魁祸首是floor()功能.它不仅很慢,而且没有矢量化(使用英特尔编译器,又称ICL). 以下是一些在2D矩阵中为所有单元格进行地板的基准: VC: 0.10 ICL: 0.20 将其与简单的演员进行比较: VC: 0.04 ICL: 0.04 floor()如何比简单的演员慢得多?它基本上是同一件事(负数为负数). 第二个问题:有人知道超快速floor()实现吗? ps:这是我正在基准测试的循环: void Floor(float *matA, int *intA, const int height, const int width, const int width_aligned) { float *rowA=NULL; int *intRowA=NULL; int row, col; for(row=0 ;
0 2023-05-23
编程技术问答社区
长双数的性能影响。为什么C语言选择64位而不是硬件的80位作为其默认值?
对于详细信息,我正在谈论X87 PC体系结构和C编译器. 我正在写自己的解释器,以及double数据类型背后的推理使我感到困惑.特别是在效率方面.有人可以解释为什么C决定了64位double而不是硬件本机80位double?为什么硬件在80位double上安顿下来,因为那是不对齐的?每个人的性能含义是什么? 我想为我的默认数字类型使用80位double.,但是编译器开发人员的选择使我担心这不是最好的选择. double在x86上只有2个字节短,为什么编译器默认不使用10个字节long double? 我可以获得80位long double vs double的额外精确度的示例吗? 为什么Microsoft禁用long double 默认情况下? 在典型的X86/x64 PC硬件上,long double long double long double long double 解决方案 根据神秘性的说法,答案是Microsoft使用 sse2 对其double数
0 2023-05-23
编程技术问答社区
省略帧指针是否真的对性能有积极影响,而对调试能力有消极影响?
正如很久以前建议的那样,我总是在没有框架指针的情况下构建发布可执行文件(如果您使用/ox编译). ). 但是,现在我在论文中阅读了 http:http://research. microsoft.com/apps/pubs/default.aspx?id=81176 ,该框架指针对性能没有太大影响.因此,将其完全优化(使用/ox)或用框架指针(使用/ox/oy-)充分优化它并没有真正改变. 微软似乎表明添加帧指针(/oy-)使调试变得更加容易,但是情况确实如此吗? 我做了一些实验,并注意到了: 在一个简单的32位测试中可执行的(使用/ox/ob0编译)中,框架指针的省略确实会提高性能(约为10%).但是此测试可执行文件只能执行一些函数调用,没有别的. 在我自己的应用程序中,添加/删除框架指针似乎并没有很大效果.添加帧指针似乎使应用程序更快约5%,但这可能在错误余量之内. 关于框架指针的一般建议是什么? 是否应该在发行版中省略(/ox),因为它们确实
0 2023-05-23
编程技术问答社区
Windows C++纳秒级计时?
Windows上的C ++有办法测量纳秒中的时间? 我只能找到Linux解决方案. 解决方案 使用/a>函数,以查看查询PerformanceCounter在以什么速度运行的速度.我认为它可能在纳秒范围内. 其他解决方案 查看Windows上的QueryPerformanceCounter. 定时代码识别性能瓶颈时,您需要使用 系统必须提供的最高分辨率计时器.本文 描述如何使用QueryPerformanceCounter to Time 应用程序代码 http://support.microsoft.com/kb/kb/172338 其他解决方案 如果您可以运行自己的组件,则可以读取CPU的周期计数器,并将其划分为CPU的时钟速率: static inline uint64_t get_cycles() { uint64_t t; __asm__ __volatile__ ("rdtsc" : "=A"(t)); return t
0 2023-05-23
编程技术问答社区
测量C++中的异常处理开销
衡量异常处理高架/性能的最佳方法是什么? 请提供独立的代码样本. 我是针对Microsoft Visual C ++ 2008和GCC. 我需要从以下情况下获得结果: 当没有尝试/捕获块 时,开销 当有尝试/捕获块时,开销 没有例外 抛出例外的头顶 解决方案 第5.4节的第5.4节性能完全专门用于例外的开销. 其他解决方案 作为一个建议:当例外时,不要太多的开销.例外处理实现通常不会使投掷速度快速且速度缓慢.没关系,因为这些情况非常出色. 卡尔 其他解决方案 这是我想到的测量代码.您看到它有什么问题吗? 到目前为止,在Linux和Windows上都可以使用: 编译: g++ exception_handling.cpp -o exception_handling [ -O2 ] 或例如 Visual C ++ Express . 获取基本情况("完全从语言中删除了异常支持"),使用: g++ exce
0 2023-05-23
编程技术问答社区
为什么std::vector::operator[] 比std::vector::at()快5到10倍?
在程序优化期间,试图优化通过向量迭代的循环,我发现以下事实::: std :: vector :: at()比操作员[]! 非常慢. 运算符[]比()的速度快5到10倍,在发行版和调试构建中(VS2008 x86). 在网络上阅读一点使我意识到在()有边界检查.好的,但是,将操作放慢多达10次?! 有什么理由吗?我的意思是,边界检查是一个简单的数字比较,还是我缺少某些内容? 问题是该表演的真正原因是什么? 此外,是否有任何方法可以使其更快? 我肯定会在其他代码零件中与[]进行[]的所有AT()调用(在其中我已经具有自定义边界检查!). 概念证明: #define _WIN32_WINNT 0x0400 #define WIN32_LEAN_AND_MEAN #include #include #include #define ELEMENTS_IN_VECTOR 1000000
0 2023-05-23
编程技术问答社区
用visual studio编译代码时,如何使用arch参数?
我的目标是在可用时使用SIMD指令开发代码,而在没有SIMD指令的情况下则没有.更具体地说,在我的C代码中,我正在拨打明确的simd调用并检查这些调用是否有效根据我要拉的处理器信息有效. 我有很多问题,但是在足够的键入之后,我指出了我: 检测SIMD指令集在Visual Studio 2015中与C ++宏一起使用 唯一剩下的问题是/arch标志如何影响显式SIMD代码?即使您的拱门未设置,这仍然可以工作吗?例如,我可以在没有/拱门的情况下编写avx2调用:avx2? 解决方案 这里有几个零件. 首先,经典的英特尔32位X86代码使用了用于浮点的X87指令集,并且编译器将使用x87的float和double类型生成代码.长期以来,这是为32位构建时视觉C ++编译器的默认行为.您可以使用/arch:IA32使用32位代码强制使用 - 此开关对64位无效. 对于AMD64 64位代码(Intel也已通过64位采用了通常称为X64的64位),将X87指令集与3
6 2023-05-23
编程技术问答社区