我有一个像这样的结构
struct MyStructure
:IFoo
{
}
Run Code Online (Sandbox Code Playgroud)
和这样的方法:
public BarThisFoo(IFoo a)
{
}
Run Code Online (Sandbox Code Playgroud)
我的问题是将结构传递给该方法的"框"结构,从而导致垃圾分配?
附录:在有人说之前,垃圾收集在这个应用程序中不是免费的,它实际上对垃圾收集非常敏感,所以免费分配代码很重要.
我想在屏幕上绘制一些项目,每个项目都在N套中.集合的数量一直在变化,因此我需要计算尽可能不同的N种不同的颜色(以便于识别哪个集合中的内容).
因此,例如,当N = 2时,我的结果将是黑色和白色.有三个我猜我会全红,全绿,全蓝.对于所有四个人来说,正确的答案是不太明显的,这就是我遇到麻烦的地方.
编辑::显而易见的方法是将0映射到红色,将1映射到绿色,将其间的所有颜色映射到适当的彩虹颜色,然后通过GetRainbowColour(N/TotalSets)获得集合N的颜色,因此GetRainbowColour方法就是解决这个问题所需要的
给定两个字节,如何在两个字节的开头找到公共位的长度.
例如:
9 == 00001001
6 == 00000110
Common prefix is 0000, length 4
Run Code Online (Sandbox Code Playgroud)
我在C#工作,所以请坚持使用C#操作.
附录:这段特殊的代码将运行数千次,并且需要非常快.
我有一些使用 Protobuf.net 的相当简单的代码,它抛出了一个非常奇怪的异常。在第 167 行的 MetaType.cs 中,它抛出 InvalidOperationException “一旦生成序列化程序,就无法更改类型”。这是什么意思,我该如何解决?
我的代码如下所示:
这个方法开始所有的序列化:
while (!Parallel.For(0, 100, (i) =>
{
Widget w;
lock (f) { w = f.CreateWidget(); }
SerialiseWidget(w);
}).IsCompleted)
{
Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)
非常简单,它只是在 Parallel 中遍历所有内容,并序列化 100 个小部件。
serialise 方法也很简单:
private byte[] SerialiseWidget(Widget w)
{
using (MemoryStream m = new MemoryStream())
{
Serializer.Serialize<PacketChunk>(m, w);
return m.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
最后,小部件类如下所示:
[ProtoContract]
private class Widget
{
[ProtoMember(1)]
public int a;
[ProtoMember(2)]
public byte[] b;
[ProtoMember(3)]
public Thing c; //Thing is itself a protocontract
[ProtoMember(4)] …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的协议缓冲区设置:
[ProtoContract]
Foo
{
[ProtoMember(1)]
Bar[] Bars;
}
Run Code Online (Sandbox Code Playgroud)
单个Bar被编码为67字节的协议缓冲区.这听起来是正确的,因为我知道Bar几乎只是一个64字节的数组,然后有3个字节的开销用于长度前缀.
但是,当我使用20 Bars的数组编码Foo时,需要1362个字节.20*67是1340,所以只有22个字节的开销用于编码数组!
为什么这会占用这么多空间?我能做些什么来减少它吗?
我有一种方法可以将数据从 System.Drawing.Bitmap 中复制出来,如下所示:
var readLock = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
byte[] data = new byte[3 * image.Width * image.Height];
if (data.Length != readLock.Stride * readLock.Height)
throw new InvalidOperationException("Incorrect number of bytes");
Marshal.Copy(readLock.Scan0, data , 0, data.Length);
image.UnlockBits(readLock);
Run Code Online (Sandbox Code Playgroud)
非常简单,它适用于我的大多数图像。但是,对于非常小的图像 (14x14),它会遇到异常。在失败的情况下,Stride 是 44,而不是预期的 42 (14 * 3)。
像素格式为 Format24bppRgb,因此图像中的每个像素应该有三个字节。这些额外的字节来自哪里,在处理图像数据时如何处理它们?
对于任何感兴趣的人,我正在从高度图生成法线数据,因此我需要能够准确地获取每个像素及其邻居)。
我正在制作一个行星上的游戏,我计划存储数据的方式是6个二维数组,这是围绕球体的高度图(在立方体的面上).我遇到的问题是,给定一个从球体中心向外指向的归一化向量,我如何确定这两个方面:
我目前的解决方案是这个(使用XNA):
一个有用的约束是球体/立方体系统位于原点附近.
因此,需要解决的问题是: 给定方向向量,如何确定它与周围立方体的交叉点.使用此结果,我如何在2D立方体中获取正确的值,该数组在此立方体的表面上"绘制"?
我目前有一个hashsets的问题.我有不可变的类,只包含一个项目,当我将两个不同的类添加到相同的数据到一个哈希集时,我在集合中得到它们.这很奇怪,因为我在基类和超类上都重载了Equals和GetHashCode.
public abstract class Contact :IEquatable<Contact>
{
public readonly BigInteger Id;
public Contact(BigInteger id) { this.Id = id; }
public abstract bool Equals(Contact other);
public abstract int GetHashCode();
public abstract bool Equals(object obj);
}
Run Code Online (Sandbox Code Playgroud)
而继承类:
public class KeyOnlyContact :Contact, IEquatable<KeyOnlyContact>
{
public KeyOnlyContact(BigInteger id) :base(id) { }
public override bool Equals(object obj)
{
if (obj is KeyOnlyContact)
return Equals(obj as KeyOnlyContact);
else if (obj is Contact)
return Equals(obj as Contact);
else
return (this as object).Equals(obj);
}
public override bool Equals(Contact …Run Code Online (Sandbox Code Playgroud) 我有一个cron作业,我每三分钟运行一次,从远程API中提取一些数据,然后将其存储在我的本地数据存储区中.但是,这会在数据存储区放置操作中占用大量CPU时间.我怀疑我可能正在做一些非常愚蠢的事情,可以进行大量优化:
result = urllib2.urlopen(url).read()
foos = json.loads(result)['foo']
bars = json.loads(result)['bar']
models = []
for foo in foos:
d = FooContainer()
d.Property = foo.Value #in real code, this is setting a load of values based off foo
models.append(d)
for bar in bars:
d = BarContainer()
d.Property = bar.Value #in real code, this is setting a load of properties based off bar
models.append(d)
db.put(models)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将每个数据存储在本地数据存储表中作为新的"行"存储.是否有一些技术可以用来减少这个cron作业使用的巨大数据存储CPU时间?