我知道,GetBuffer()
在C#/一个MemoryStream.NET必须小心使用,因为,作为文档描述了这里,有可能在年底未使用的字节,所以你必须要确保只在第一MemoryStream的期待缓冲区中的.Length字节.
但后来我遇到了一个案例,其中缓冲区开头的字节是垃圾!实际上,如果您使用像反射器这样的工具并查看ToArray()
,您可以看到:
public virtual byte[] ToArray()
{
byte[] dst = new byte[this._length - this._origin];
Buffer.InternalBlockCopy(this._buffer, this._origin, dst, 0,
this._length - this._origin);
return dst;
}
Run Code Online (Sandbox Code Playgroud)
所以要对返回的缓冲区做任何事情GetBuffer()
,你真的需要知道_origin.唯一的问题是_origin是私有的,没有办法实现它......
所以我的问题是-什么是使用GetBuffer()
在MemoryStream()
无将MemoryStream是如何构造的一些先验知识(这是什么套_origin)?
(正是这个构造函数,只有这个构造函数,设置原点 - 当你想要一个字节数组的MemoryStream从字节数组中的特定索引开始时:
public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible)
Run Code Online (Sandbox Code Playgroud)
)
我们有一个简单的内存吞吐量基准.对于大块内存,它所做的只是重复记忆.
在几台不同的机器上查看结果(针对64位编译),Skylake机器的性能明显优于Broadwell-E,保持OS(Win10-64),处理器速度和RAM速度(DDR4-2133)不变.我们不是说几个百分点,而是大约2个因素.Skylake配置为双通道,Broadwell-E的结果不会因双/三/四通道而异.
任何想法为什么会这样?随后的代码在VS2015的Release中编译,并报告完成每个memcpy的平均时间:
64位:Skylake为2.2ms,Broadwell-E为4.5ms
32位:Skylake为2.2ms,Broadwell-E为3.5ms.
通过利用多个线程,我们可以在四通道Broadwell-E构建上获得更大的内存吞吐量,这很不错,但是看到单线程内存访问的这种巨大差异令人沮丧.为什么差异如此显着的任何想法?
我们还使用了各种基准测试软件,他们验证了这个简单示例所展示的内容 - 单线程内存吞吐量在Skylake上更好.
#include <memory>
#include <Windows.h>
#include <iostream>
//Prevent the memcpy from being optimized out of the for loop
_declspec(noinline) void MemoryCopy(void *destinationMemoryBlock, void *sourceMemoryBlock, size_t size)
{
memcpy(destinationMemoryBlock, sourceMemoryBlock, size);
}
int main()
{
const int SIZE_OF_BLOCKS = 25000000;
const int NUMBER_ITERATIONS = 100;
void* sourceMemoryBlock = malloc(SIZE_OF_BLOCKS);
void* destinationMemoryBlock = malloc(SIZE_OF_BLOCKS);
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
while (true)
{
LONGLONG total = 0;
LONGLONG max = 0;
LARGE_INTEGER StartingTime, …
Run Code Online (Sandbox Code Playgroud) 我有一组实用函数和其他代码,我将它们点源到我编写的每个 powershell 文件中。在被调用者作用域变量影响后,我开始考虑将其更改为 powershell 模块。
我在其中做的一些特殊事情遇到了问题,实际上我确实希望在范围之间进行一些交互。我想知道是否有任何方式“进入”模块调用者的范围以在移动到 powershell 模块时保持此功能?
如果没有,我将这些更专业的东西保存在一个点源文件中并将更传统的实用程序功能移动到一个模块中是我最好的方法吗?以下是不容易移至模块的内容:
设置严格模式和错误操作首选项以保持理智,例如:
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$PSDefaultParameterValues['*:ErrorAction']='Stop'
Run Code Online (Sandbox Code Playgroud)
当代码从 .psm1 powershell 模块运行时,这(如预期)对调用者的环境没有影响。有没有办法从 psm1 范围跨越到调用者范围来进行这些更改?
打印出有关顶级脚本调用的信息,例如:
$immediateCallerPath = Get-Variable -scope 1 -name PSCommandPath -ValueOnly
Write-Host "Starting script at $immediateCallerPath"
$boundParameters = Get-Variable -scope 1 -name PSBoundParameters -ValueOnly
Write-Host "Bound parameters are:"
foreach($psbp in $boundParameters.GetEnumerator())
{
"({0},{1})" -f $psbp.Key,$psbp.Value | Write-Host
}
Run Code Online (Sandbox Code Playgroud)
同样,这些命令一旦放置在 .psm1 文件中就无法再看到最顶层的调用范围
我想使用protobuf在客户端和服务器之间来回发送消息.在我的情况下,我想从服务器向客户端发送任意数量的protobuf消息.如何在C++中快速构建它?
注意:在汇总了一个非常有用的Kenton Varda答案和Fulkerson对stackoverflow的回答之后,我写了这个问题和我的答案.其他人也提出了类似的问题并遇到了类似的障碍 - 请看这里,这里和这里.
我是protobuf和asio的新手,所以请随时纠正/建议改进,或提供自己的答案.
Json.NET并不总是正确地考虑到宣布 ValueType
的Dictionary<KeyType,ValueType>
。
Dictionary<string,object>
如果一个值恰好是一个DefaultContractResolver.CanConvertToString()
返回 true的值,这使得序列化变得非常不可行,除非我遗漏了一些东西。Rect
.NET 4.0 中就是这样一种类型。我在 Json.NET 4.5r11 和 5.0r2 中尝试过这个。考虑以下代码:
_requestSerializerJson = new JsonSerializer();
// Even setting TypeNameHandling to All doesn't change the deserialized result
Dictionary<string, object> dictionary = new Dictionary<string, object>();
Rect a = new Rect(1, 2, 3, 4);
dictionary.Add("myrect", a);
byte[] bytes;
using (MemoryStream requestStream = new MemoryStream())
using (var streamWriter = new StreamWriter(requestStream))
using (var writer = new JsonTextWriter(streamWriter))
{
_requestSerializerJson.Serialize(writer, dictionary);
writer.Flush();
bytes = requestStream.ToArray();
} …
Run Code Online (Sandbox Code Playgroud) 我有一个Grid,它有几个孩子,其中一个是ScrollViewer.我希望Grid 除了 ScrollViewer 之外基于它的所有子节点来调整大小,我想要占用通过为其余子节点调整Grid的大小而创建的空间.(例如,网格为2x2,ScrollViewer位于第0行,第0列,因此其他三个网格条目足以确定网格的尺寸.)
有一个很好的方法来做到这一点?我已经研究过创建一个自定义面板来替换网格或包含ScrollViewer,但是在MeasureOverride/ArrangeOverride调用期间我没有得到一个可以告诉我网格行的最终宽度/高度的调用/列我关心(例如,第0行,第0列).
我有一个想法是从Grid派生并调用基础MeasureOverride/ArrangeOverride但在调用之前从网格的子项中删除ScrollViewer(并在之后将其放回),但在布局计算期间弄乱可视树似乎是馊主意.
这是一个例子:
<Grid x:Name="LayoutRoot" Background="White">
<Grid VerticalAlignment="Top" HorizontalAlignment="Left">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Row="0" Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
<Button Height="300" Width="300"/>
</ScrollViewer>
<Button Grid.Row="1" Grid.Column="0" Height="100" Width="100" Content="1,0"/>
<Button Grid.Row="0" Grid.Column="1" Height="100" Width="100" Content="0,1"/>
<Button Grid.Row="1" Grid.Column="1" Height="100" Width="100" Content="1,1"/>
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
我希望Grid的大小不会随着ScrollViewer中Button的大小的变化而改变 - 例如,我希望Grid为ScrollViewer提供100x100的平方,该平方由Grid的其余内容决定.如果我将3个100x100按钮中的每个按钮更改为200x200,我希望ScrollViewer获得200x200等等.
Pavlo的例子让我到目前为止最接近,网格行/列的大小合适,但是当调用Arrange时,ScrollViewer不适应给定的大小.见下文:
我今天了解到,在Windows上的python中,做的与做os.chdir('f:\\')
的完全不同os.chdir('f:')
.带有反斜杠的命令实际上会更改当前目录.如果没有反斜杠,该命令就像f:
在命令提示符下键入一样,并将当前目录更改为f
驱动器上的最后一个当前目录.
这是一个例子:
import time
import os
if __name__ == '__main__':
os.chdir('f:\\directory')
print 'cwd is {}'.format(os.getcwd())
os.chdir('d:\\directory')
print 'cwd is {}'.format(os.getcwd())
os.chdir('f:')
print 'cwd is {}'.format(os.getcwd())
os.chdir('f:\\')
print 'cwd is {}'.format(os.getcwd())
Run Code Online (Sandbox Code Playgroud)
版画
cwd is f:\directory
cwd is d:\directory
cwd is f:\directory
cwd is f:\
Run Code Online (Sandbox Code Playgroud)
我可以理解为什么这种差异很有用,但找不到任何记录这种行为的东西.我已经习惯了从我的目录中留下拖尾斜线,因为我通常在这里使用字符串......
这种行为记录在哪里吗?我可以依靠它不改变吗?
.net ×1
benchmarking ×1
boost-asio ×1
c++ ×1
chdir ×1
getbuffer ×1
grid ×1
intel ×1
json.net ×1
layout ×1
memorystream ×1
performance ×1
powershell ×1
python ×1
silverlight ×1
wpf ×1
x86 ×1