我使用.NET Framework中实现的集合类型做了一些基准测试.
从参考源我知道List<T>使用数组来存储内容.为避免每次插入时调整数组大小,每次可用空间用完时,数组长度都会加倍.
根据我的理解,除了需要重新分配内部数组的情况外,图表应该是严格不变的.这种行为是否有任何原因,可能与CLR或Windows内存管理/内存碎片有关? 基准测试在Windows 10/i7-3630QM机器上以64位应用程序执行(源代码如下所示).由于单个添加操作无法测量,因此我创建了1000个列表,并为每个列表大小添加了一个项目.
Run Code Online (Sandbox Code Playgroud)
for (int i = 1; i <= MaxCollectionSize; i++)
{
// Reset time measurement
TestContainer.ResetSnapshot();
// Enable time measurement
TestContainer.BeginSnapshot();
// Execute one add operation on 1000 lists each
ProfileAction.Invoke(TestContainer);
TestContainer.EndSnapShot();
double elapsedMilliseconds = (TestContainer.GetElapsedMilliSeconds() / (double)Stopwatch.Frequency) * 1000;
// ...
}
编辑:我仔细检查了我的结果,是的,它们是可重复的.我将测试的集合数量从1000增加到10000,结果现在更加平滑(见下图).现在可以清楚地看到调整内部阵列大小的尖峰.然而在图中的步骤仍然存在-这是与预期的O(1)复杂性的阵列插入应该是,如果你忽略调整大小存在分歧.
我还尝试在每次Add操作之前触发GC集合,图表保持完全相同.
关于创建委托对象的问题:我的所有委托(例如ProfileAction)都是在一个完整的测试周期中保持分配的实例属性,在这种情况下是10000个列表,每个列表有1000个添加操作.
我正在制作与安全相关的计划,我想确保我以正确的方式这样做.当有人使用密码登录时,密钥会被解密并存储在变量中.当他们注销时,我希望内存中的数据被完全删除,而不仅仅是标记为已删除.我目前正在做以下事情:
public void Logout()
{
RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
for (var i = 0; i < 3; i++)
{
byte[] data = new byte[(int) Math.Round((double) (_phraseHash.Count()))];
rngCsp.GetBytes(data);
int randomNum = BitConverter.ToInt32(data, 0);
_phraseHash = randomNum.ToString();
}
LoggedIn = false;
_phraseHash = null;
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,这是否足以从系统中完全删除密钥(_phraseHash).
这甚至是必要的吗?我实际上并不知道内存中的数据是如何被删除的,我只是假设它有点类似于硬盘驱动器如何工作,其中字节被标记为删除并在其他需要空间时重写.
我在 OpenShift/Kubernetes 环境中运行 Zookeeper。我已将 zookeeper 设置为 a StatefulSet,以便可靠地保留配置数据。
我在我zoo.cfg的主机名中配置了三个服务器,但是在启动时,主机名解析失败。我验证了主机名确实可以在我的集群中使用 nslookup 解析。
动物园.cfg:
clientPort=2181
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/log
tickTime=2000
initLimit=10
syncLimit=2000
maxClientCnxns=60
minSessionTimeout= 4000
maxSessionTimeout= 40000
autopurge.snapRetainCount=3
autopurge.purgeInteval=0
server.1=zookeeper-0.zookeeper-headless:2888:3888
server.2=zookeeper-1.zookeeper-headless:2888:3888
server.3=zookeeper-2.zookeeper-headless:2888:3888
Run Code Online (Sandbox Code Playgroud)
我的 OpenShift / Kubernetes 配置的相关部分:
# StatefulSet
- apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
labels:
app: zookeeper
name: zookeeper
spec:
serviceName: zookeeper-headless
replicas: 3
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- image: 172.30.158.156:5000/os-cloud-platform/zookeeper:latest
name: zookeeper
ports:
- containerPort: 2181
protocol: TCP
name: client
- containerPort: 2888
protocol: TCP
name: …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
private void btnReminder_Click(object sender, EventArgs e)
{
timer2.Start();
}
private void timer2_Tick(object sender, EventArgs e)
{
DateTime Date = DateTimePickerReminderDate.Value;
DateTime Time = DateTimePickerReminderTime.Value;
if (DateTime.Now.CompareTo(Date) > 0 && DateTime.Now.CompareTo(Time) > 0)
{
Date = DateTime.MaxValue;
Time = DateTime.MaxValue;
MessageBox.Show("Your Reminder");
timer2.Stop();
}
}
Run Code Online (Sandbox Code Playgroud)
当我设置提醒它按预期工作并在正确的时间显示消息.但问题是,它不断弹出消息框我试图清除这个错误但我没有成功.所以我现在需要专家建议所以请帮我清除这个bug.

我正在尝试向我的 Spark master 提交 Spark 应用程序。主站和多个从站正在 OpenShift 环境中运行。Spark master 的 Web UI 显示了连接的工作线程。
应用程序 jar 部署到/jars每个 Spark pod 中。
这是我的提交脚本:
spark-submit2.cmd --conf "spark.driver.extraClassPath=/jars"
--conf "spark.executor.extraClassPath=/jars"
--conf "spark.submit.deployMode=cluster"
--master spark://******:31824
--class Main 'local:/jars/SparkHelloWorld-1.0-SNAPSHOT.jar'
Run Code Online (Sandbox Code Playgroud)
应用程序本身很简单:
public class Main {
private static String MASTER = "spark://******:31824";
public static void main(String[] args) throws Exception {
//Create a SparkContext to initialize
SparkConf conf = new SparkConf()
.setMaster(MASTER)
.setAppName("SparkPi");
// Create a Java version of the Spark Context
JavaSparkContext sc = new JavaSparkContext(conf);
final …Run Code Online (Sandbox Code Playgroud) 我正在使用Xceed Extended WPF Toolkit来显示带有[Flags]属性的枚举PropertyGrid.
[Flags]
public enum TestEnum
{
Test1 = 1,
Test2 = 2,
Test3 = 4,
Test4 = 8,
Test5 = 16,
Test6 = 32,
Test7 = 64,
}
Run Code Online (Sandbox Code Playgroud)
因为我无法在编译时知道枚举定义,所以我将使用EnumBuilder动态创建枚举.
我创建了一个编辑器来显示枚举CheckComboBox:
public class CheckComboBoxEditor : TypeEditor<CheckComboBox>, ITypeEditor
{
protected override void SetValueDependencyProperty()
{
ValueProperty = CheckComboBox.SelectedValueProperty;
}
protected override CheckComboBox CreateEditor()
{
return new CheckComboBox();
}
protected override void ResolveValueBinding(PropertyItem propertyItem)
{
var _binding = new Binding("Value");
_binding.Source = propertyItem; …Run Code Online (Sandbox Code Playgroud) 我已经定义了一个公共枚举,如下所示:
public enum guests
{
One,
Two
}
Run Code Online (Sandbox Code Playgroud)
我想要做的就是让它像下面这样
public enum guests
{
1,
2
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这个时,我一直收到这个错误:
Identifier expected
Run Code Online (Sandbox Code Playgroud)
我可以设置int而不是字符串吗?
c# ×5
enums ×2
openshift ×2
.net ×1
.net-4.6 ×1
apache-spark ×1
arrays ×1
java ×1
kube-dns ×1
kubernetes ×1
memory ×1
messagebox ×1
performance ×1
security ×1
winforms ×1
wpf ×1
wpftoolkit ×1
xceed ×1