在许多Redis教程(例如本教程)中,数据存储在一个集合中,但是多个值组合在一个字符串中(即用户帐户可能存储在集合中作为两个条目,"user:1000:username"和"用户:1000:密码").
但是,Redis也有哈希.似乎有一个"user:1000"哈希更有意义,它包含一个"用户名"条目和一个"密码"条目.您只需直接在哈希中访问它们,而不是连接字符串以访问特定值.
那么为什么不使用它呢?这些只是旧教程吗?或者Redis哈希有性能问题吗?
我目前使用Visual Studio 2010在Windows上使用C++进行开发.在C++ 11正式发布之后,我开始使用MSVC中已有的一些功能.但是,正如预期的那样,绝大多数新变化都不受支持.
我想也许即将推出的Visual Studio版本会添加这些新功能.然而,看完之后这看起来很少会改变.
因此,我很好奇在Windows而不是MSVC上使用GCC的可行性,因为它似乎已经支持绝大多数C++ 11.据我所知,这意味着使用MinGW(我还没有看到任何其他本地Windows版本的GCC).但我对这是否值得尝试有疑问:
为什么某些静态库(lib*.a)可以以与共享库(lib*.so)链接(ld -l switch)相同的方式链接,但有些不可以?
我一直被教导所有库,无论是否静态,都可以与-l ...链接,但是我到目前为止遇到了一个库(GLFW),如果我发出"未定义的引用"链接错误,它什么都不做试图以这种方式链接它.
根据对这个问题的回答,链接静态库的"正确"方法是将它们与我自己的目标文件一起直接包含在内,而不是使用-l.而且,就GLFW库而言,这肯定解决了这个问题.但是我正在使用的每个其他静态库在与-l链接时工作得很好.
所以:
我已经开始了一个新的游戏项目,并决定为它学习和使用OpenGL(项目正在Windows和Linux上同时开发).与此同时,我对测试驱动开发也非常感兴趣,并且我正在努力编写单元测试,以便在任何实际代码之前进行设计.
但是,我认为我缺乏知识可能会让我感到沮丧,而且我一直试图为代码库的"渲染"部分编写单元测试.我希望有人可以给我一些关于如何继续的见解.
我知道我需要单独测试我与OpenGL的交互,而不是OpenGL本身.我能看到这样做的唯一方法是在某种程度上将OpenGL从我的其余代码中抽象出来,或者通过拦截OpenGL函数调用,或者通过创建一个全新的类接口,允许我创建该类的模拟版本用于测试.(更好的方法是将它们抽象到一个单独的命名空间中的一组非类函数而不是虚拟类抽象,但我不知道如何模拟它.)
但是,由于我还在学习OpenGL,所以我对这个抽象应该是什么样子只有一个概念.例如,我应该包装每个OpenGL调用,还是根据要完成的任务将它们分组到更高级别的函数中?瘦包装器只会调用特定的OpenGL函数,所以我不需要事先测试它们,但我最终可能需要包含大量函数.再说一遍,如果我走得太远,并且通过任务将多个OpenGL调用组合起来,我觉得我最终会在我开始的地方结束,使用OpenGL进行大量代码,本身需要在使用前进行测试.
中间地方在哪里?如何在学习使用OpenGL的同时事先进行适当的单元测试?
场景:在您上次提交之后,您决定对代码库进行一些广泛的重构.过了一段时间,你意识到它花费的时间比预期的要长,你真的宁愿再次推迟重构,并且要处理更紧迫的任务.但是你不想失去你到目前为止所做的所有重构工作.
那么,有没有办法"存档"或"分支"工作副本(实际上,将其置于一边但保留在存储库中供以后访问),然后从那里恢复到最后一个良好的提交和恢复,而不用担心创造多个头或让两个混合起来?
我需要一个具有向量和列表属性的容器.我需要快速随机访问容器中的元素,但我还需要能够删除容器中间的元素而不移动其他元素.我还需要能够迭代容器中的所有元素,并一目了然(没有迭代)容器中有多少元素.
经过一番思考,我已经想通了,我怎么可以创造这样的容器,使用载体为基础的容器,和包装一个结构中还包含域记录元素是否有效范围内的实际存储的数据,以及指针指向向量中的next/previous有效元素.结合一些超载等,听起来应该是相当透明的并满足我的要求.
但在我真正开始创建另一个容器之前,我很好奇是否有人知道实现这个问题的现有库?我宁愿使用一些有用的东西,而不是花时间调试自定义实现.我查看了Boost库(我已经在使用它),但是没有在那里找到它.
Asio是否仍然与Boost分开开发,或Boost.Asio是唯一仍在更新的版本?
在Asio网站上,他们谈到两个版本都有好处,而且Asio比Boost更新的频率更高.然而,该网站上最新的开发版本是2011年3月发布的1.5.3,而2013年2月发布的最新版Boost 1.53包括Asio 1.8.3,自1.5.3以来发生了大量变化.
Asio网站在没有通知的情况下被放弃了,仅支持Boost-only更新,或者它已移至我未找到的某个位置.有谁知道发生了什么?
我问的原因是我试图从我的项目中删除Boost,而Boost.Asio是我目前使用的唯一Boost库.Asio本身就是一个只有头文件的库,但Boost.Asio引入了其他几个未使用的Boost库(System,Regex,Date_Time).
我愿意切换到另一个轻量级套接字库,但还没有找到一个像Asio一样好的(在低依赖性和使用本机平台iocp/epoll方法方面).
我正在编写一个golang程序,它接受一个字符串列表,并按字符串的第一个字符将它们分类到存储桶列表中.但是,我希望它能够使用最类似的非重音字符对重音字符进行分组.所以,如果我有一个字母A的桶,那么我想要包含以Á开头的字符串.
Go有没有内置的东西来确定这个,或者我最好选择一个包含所有字符及其重音变体的大型switch语句?
我有一个简单的WPF应用程序,它正在执行SQL查询并在DataGrid中显示结果数据.
一切都按预期工作,除了表现很糟糕.单击按钮加载数据,实际看到数据显示在DataGrid中的时间长度大约为3-4秒.打开行虚拟化时速度要快一些,但由于我需要能够对滚动后不再可见的单元格执行操作,因此我不得不关闭它.即使启用了虚拟化,显示数据的速度也比我想要的慢.
我首先假设SQL数据库速度很慢,但我做了一些测试,发现我在几分之一秒内将所有数据从SQL服务器(几百行)读入DataTable.直到我将DataTable绑定到DataGrid的DataContext,所有内容都锁定了几秒钟.
那么为什么DataContext如此之慢?我的计算机是全新的,所以我很难理解为什么需要花费任何时间来填写DataGrid,考虑到我首先检索数据的速度有多快.
(我也尝试绑定到DataGrid的ItemSource而不是DataContext,但性能是相同的.)
是否有另一种方法将数据加载到具有更合理性能的DataGrid中?如果需要,即使是DataGrid的替代品也许值得探索.
编辑:在Vlad的建议下,我尝试了另一个绕过SQL查询的测试.我用DataTable填充了1000行随机生成的数据.没变.数据生成并在一秒钟内写入DataTable.但是,将其附加到DataGrid需要20多秒.
下面是我正在使用的DataGrid XAML.除了绑定之外,它非常简单,没有附加自定义代码.
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="dataGridWellReadings" GridLinesVisibility="None" CanUserResizeRows="False" SelectionUnit="Cell" AlternatingRowBackground="#FFE0E0E0" RowBackground="#FFF0F0F0" HorizontalScrollBarVisibility="Disabled" SelectedCellsChanged="dataGridWellReadings_SelectedCellsChanged" EnableRowVirtualization="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Date" Binding="{Binding readingDate, StringFormat=yyyy-MM-dd}" Width="3*">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="KeyboardNavigation.IsTabStop" Value="False" />
<Setter Property="BorderThickness" Value="0"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Pt" Binding="{Binding readingPt, StringFormat=0.#}" Width="2*">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="KeyboardNavigation.IsTabStop" Value="False" />
<Setter Property="BorderThickness" Value="0"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Pc" Binding="{Binding readingPc, StringFormat=0.#}" Width="2*">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="KeyboardNavigation.IsTabStop" Value="False" />
<Setter Property="BorderThickness" Value="0"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn> …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试学习 Perlin 噪声,特别是用于地形生成的 2D 噪声。过去几天我一直在网上阅读文章,但他们似乎并不都同意 Perlin 噪声的工作原理,而且那些看起来很权威的文章很难理解。
所以我有一些问题,我希望这里有人可以帮助澄清。
一些文章谈到从随机数网格(二维噪声的二维网格)开始,这是有道理的。然而,其他文章讨论了用梯度向量填充网格。哪个实际上用于柏林噪声?
我不知道什么是“梯度”向量,但如果它是一个实际向量,这意味着用两个数字填充网格上的每个点,对吗?它只是一种为每个网格点获取两个随机数的方法,还是有理由将其视为方向向量?文章讨论了计算向量之间的距离,但我认为这就是插值步骤的目的......
许多关于柏林噪声的文章都谈到将多个级别的噪声组合成具有不同频率和幅度的八度音程,以获得我正在寻找的良好的有机结果。但是,其他文章说柏林噪声只是单个八度音程,而将多个级别的噪声组合成多个八度音程的行为实际上是“分数布朗噪声”。哪个是正确的?柏林噪声本身只是一种白噪声,而不是每个人都使用它的组合噪声吗?
有些文章用一组初始随机值填充网格以供使用,有些文章只是编写它们的噪声函数,这样它就不是完全随机的,而是为给定的输入吐出相同的值。这是有道理的,因此结果(尤其是在 2D 中)看起来并不混乱。但是当您开始组合多个八度音程 (FBN) 时呢?每个八度音阶都需要来自同一组值吗?或者您可以为每个八度音程设置一个单独的网格(或生成器函数)吗?我想避免重复(在结果图像上看到相同的模式重复),但我不知道它背后的逻辑是什么。
至于您开始使用的随机值网格(或梯度向量...),该网格的大小与您正在创建的图像的最终大小有什么关系?还是纯粹是频率的函数?当您增加每个倍频程的样本分辨率时,您是使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?
任何澄清都会非常有帮助。谢谢。
c++ ×3
gcc ×2
algorithm ×1
boost ×1
boost-asio ×1
c# ×1
c++11 ×1
fractals ×1
glfw ×1
go ×1
linker ×1
mercurial ×1
opengl ×1
performance ×1
perlin-noise ×1
redis ×1
shelve ×1
stl ×1
string ×1
tdd ×1
unit-testing ×1
visual-c++ ×1
windows ×1
wpf ×1
wpfdatagrid ×1