对于特定碱基,是否有创建比标准%运算符更快的整数模数的技巧?
对于我的程序,我会寻找大约1000-4000(例如n%2048).有没有以执行N模量2048不仅仅是一个更快的方法:n%2048
?
网上有很多代数求解器和简化器(例如,algebra.com上的正确代数).但是,我正在寻找一些可以插入C#的东西,作为一个更大的项目的一部分(我正在制作我自己的计算器,但显然我会请求许可等).
理想情况下,我使用的代码如下:
String s = MathLib.Simplify("5x*(500/x^2*(sqrt(3)/4)+1)+2x^2+(sqrt(3)/2)*x^2");
Run Code Online (Sandbox Code Playgroud)
并且's'将简化为: "1082.532/x+5*x+2.866*x^2"
(那里的3dp准确性,但如果需要可以改变).
解决特定变量也会很好.我需要一些轻量级和快速的东西(如上所述的计算最好在5ms左右,包括启动延迟).
经过一些研究,像Sage,Octave或Mathematica这样的程序可能有点过分(我的应用程序可能只是一个小的<200k exe).Dotnumerics.com或Mathdotnet.com可能是合适的,但前者似乎没有提到代数简化,后者缺乏文档和示例是关闭的.我想知道是否有任何合适的替代方案.可在此处找到大型列表:http: //en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems
由于文件/进程监视器在进行日志记录时无法进行过滤和不必要的重复,因此我希望重新创建该程序的功能并实时记录所有Windows文件操作.
我想记录各种属性,如时间,进程名称,源路径,目标路径,操作,结果和详细信息,就像Process Monitor一样.
如何让C#从操作系统中提取此信息?
编辑:正如zett42指出的那样,FileSystemWatcher
例如,从进程本身创建的文件事件不会被拦截.举例来说,没有这些交易显示出来,即使我添加的事件:Changed
,Created
,Renamed
,和Deleted
到FileSystemWatcher
和设置EnableRaisingEvents
标志设置为true.
编辑2:使用SimonMourier建议的Microsoft.Diagnostics.Tracing.TraceEvent nuget包,我设法敲了下面的代码.
本节放入后台工作者:
Console.CancelKeyPress += (sender, e) => session.Stop();
session.EnableKernelProvider(KernelTraceEventParser.Keywords.All);
session.Source.Kernel.FileIOWrite += Kernel_FileIOWrite;
session.Source.Process();
Run Code Online (Sandbox Code Playgroud)
然后,在调用(自动)时,创建的FileIOWrite事件将运行以下命令:
private void Kernel_FileIOWrite(Microsoft.Diagnostics.Tracing.Parsers.Kernel.FileIOReadWriteTraceData obj)
{
string filename = obj.FileName;
string processpath = "";
if (obj.ProcessID == 0) processpath = "System Idle Process";
else if (obj.ProcessID == 4) processpath = "System";
else
{
try { processpath = "ID: " …
Run Code Online (Sandbox Code Playgroud) 我想我已经在Windows或.NET中发现了一个错误,正在寻找解决方法。
要重现该问题,请首先启用Windows功能“ Beta:使用Unicode UTF-8进行全球语言支持”。
您可能需要重启机器。
现在,只需在Winforms / C#中创建两个RichTextBox组件,然后添加事件:
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
string s = richTextBox1.Rtf;
richTextBox2.Rtf = s;
}
Run Code Online (Sandbox Code Playgroud)
最后,运行该程序,只需在第一个RichTextBox中键入一些内容,当它尝试写入时就会崩溃,并显示消息“文件格式无效” richTextBox2.Rtf
。如果Windows功能“测试版:将Unicode UTF-8用于全球语言支持”被禁用,则不会崩溃。
我在这里考虑两个潜在的解决方法:
1:以某种方式在C#应用程序中禁用了整个“测试版:使用Unicode UTF-8进行全球语言支持”功能,并假装从未启用过该功能。
2:在调整另一个RichTextBox的RTF之前,以某种方式编辑RTF字符串以符合新RTF应该具有的未知要求。考虑到第一个RichTextBox应该具有完全相同的RTF,这似乎是违反直觉的,但是无论如何...
************* Exception Text **************
System.ArgumentException: File format is not valid.
at System.Windows.Forms.RichTextBox.StreamIn(Stream data, Int32 flags)
at System.Windows.Forms.RichTextBox.StreamIn(String str, Int32 flags)
at System.Windows.Forms.RichTextBox.set_Rtf(String value)
at unicodeTesting.Form1.richTextBox1_TextChanged(Object sender, EventArgs e) in D:\Code\c#\_tests\unicodeTesting\Form1.cs:line 30
at System.Windows.Forms.Control.OnTextChanged(EventArgs e)
at System.Windows.Forms.TextBoxBase.OnTextChanged(EventArgs e)
at System.Windows.Forms.TextBoxBase.WmReflectCommand(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.RichTextBox.WmReflectCommand(Message& m)
at System.Windows.Forms.RichTextBox.WndProc(Message& m) …
Run Code Online (Sandbox Code Playgroud) 当我在程序中按F10时,焦点将从我的主程序窗口中丢失,然后移动到菜单栏.事实证明,这种奇怪的行为在许多Windows应用程序中很常见.
我觉得它很难看,因为Alt键做同样的事情,我们失去了一个宝贵的功能键.为什么Windows会这样做,我如何解决我的C#应用程序的情况?
这个问题可能已经多次提出过,但我无法得到适合我的典型解决方案.该提出的解决方案是把该在"的app.config"文件:
<configuration>
<startup>
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是使用简单的"Hello World"程序,我仍然会收到错误:"无法找到运行此应用程序的运行时版本.".
在某些背景下,我使用的是Windows XP(通过Windows 7上的Windows Virtual PC),并且只在XP上安装了.NET 4.0运行时.
经过一番研究,我找到了这个页面:http: //msdn.microsoft.com/en-us/library/ee941656.aspx#core
它提到"如果您的应用程序配置文件名为application-name.config,请将其重命名为application-name.exe.config.例如,将MyApp.config重命名为MyApp.exe.config.".
我试过这个,认为它可以解决问题,但我仍然得到"无法找到运行该应用程序的运行时版本".当我尝试使用.NET 4.0在WinXP上运行.NET 3.5(客户端配置文件或完整)应用程序时.
.net configuration .net-4.0 backwards-compatibility .net-3.5
编辑:赏金已过期,但如果社区想将其奖励给某人,那么我选择 Raful Chizkiyahu。
我的一个 C# Winforms 程序中存在内存泄漏,我想绘制其内存使用情况随时间变化的图表,以便更好地了解可能导致泄漏的原因。问题是,没有一个常用的内存诊断命令与任务管理器声称的该进程消耗的内存相匹配。我认为这可能是由于使用不安全/非托管代码的应用程序未包含在总数中。
因此,为了尝试深入研究,我创建了一个新的 Winforms 应用程序,非常简单,只有一个计时器来实时报告内存使用情况。我用5个标签,各家有各家的功能(主要是发现从这里开始): ,Environment.WorkingSet
,,和。GC.GetTotalMemory(false)
GC.GetTotalMemory(true)
Process.GetCurrentProcess().PrivateMemorySize64
Process.GetCurrentProcess().WorkingSet64
令人惊讶的是(或者可能不是这样,叹气),我仍然无法让这五个数字中的任何一个与 Windows 10 任务管理器相匹配。这是一个屏幕截图:
所以我基本上要寻找的是 5.1MB 的数字。我如何偷偷地从 .NET 框架中提取那个隐藏的数字?
这是我在 Timer 滴答函数中的代码:
private void timer1_Tick(object sender, EventArgs e)
{
//Refresh();
label1.Text = "Environment.WorkingSet: " + Environment.WorkingSet ;
label2.Text = "GC.GetTotalMemory(false): " + GC.GetTotalMemory(false) ;
label3.Text = "GC.GetTotalMemory(true): " + GC.GetTotalMemory(true) ;
Process proc = Process.GetCurrentProcess();
label4.Text = "proc.PrivateMemorySize64: " + proc.PrivateMemorySize64 ;
label5.Text = "proc.WorkingSet64: " + proc.WorkingSet64 ;
proc.Dispose();
} …
Run Code Online (Sandbox Code Playgroud) 假设我有一个RTL语言的字符串,例如阿拉伯语,其中包含一些英语:
string s = "Test:?????;?????;a;b"
请注意,字符串中有分号.当我使用Split命令时string[] spl = s.Split(';');
,则某些字符串以相反的顺序保存.这是发生的事情:
spl [0] ="Test:لطيفة"
spl [1] =""اليوم
spl [2] ="a"
spl [3] ="b"
与原版相比,上述内容无序.相反,我希望得到这个:
spl [0] ="Test:اليوم"
spl [1] ="لطيفة"
spl [2] ="a"
spl [3] ="b"
我准备编写自己的分割功能.但是,字符串中的字符也以相反的顺序解析,所以我回到原点.我只想浏览屏幕上显示的每个角色.
我在C#中创建了一个流行的Winforms程序,它有很多GUI小部件,并且发现当平台目标是x64时,启动速度比x86慢大约5-10倍.在x64目标下,启动大约需要5秒钟,这会对用户体验产生负面影响.我想加快速度.
我也尝试过我的另一个程序,并且发现x64下的启动时间是x86的两倍或三倍.
所以我开始怀疑是什么导致了它.我的程序使用了很多小部件,所以为了测试理论,我决定用800个按钮创建一个测试项目!我将它们全部设置为Visible=False
使重绘/刷新速度不会使水变得混乱.
令我惊讶的是,x64的启动速度比x86等效速度慢.然后我继续对该InitializeComponent();
部分进行计时,确定,x64版本在大约3.5秒内运行.另一方面,x86仅需0.275秒左右.这快了近13倍!
.NET Framework 2.0,3.0和3.5同样糟糕.在x64下针对.NET 4和4.5的情况要好得多,大约0.8秒,但这仍然是大约3倍的速度(x86差不多是0.28秒),我想使用.NET 3.5来增加用户群.
所以我的问题是:是什么导致x64版本启动速度如此之慢,如何让它更快,以便它可以与x86版本相媲美?
如果有人想立即测试,我已经创建了VS 2010项目的zip,可以在这里下载:http://www.skytopia.com/stuff/64_vs_32bit_Startup_Speed.zip
我有一个带有完整GUI的程序,需要大约750毫秒来加载,这要归功于InitializeComponent()
.经过一些研究,似乎有一些技术可以改善.NET在整个InitializeComponent
部分中所用的时间.这些包括:
1:使用NGen或类似产品.
2:使用Speed-optimize Windows Forms应用程序中显示的多线程
3:其他技术,例如在添加它们之前设置控件属性,如优化InitializeComponent所示(需要1秒!).
不幸的是(1)只改进了我的情况大约20%,并且(2)和(3)实现起来很费时间,并且牺牲了完整GUI设计者的便利性.
是否有任何自动化解决方案可以直接获取源代码,并生成更短,更高效的解决方案InitializeComponent()
?
c# ×9
winforms ×5
optimization ×2
performance ×2
.net ×1
.net-3.5 ×1
.net-4.0 ×1
64-bit ×1
algebra ×1
focus ×1
interop ×1
math ×1
memory ×1
memory-leaks ×1
modulus ×1
procmon ×1
richtextbox ×1
rtf ×1
string ×1
taskmanager ×1
unicode ×1
utf-8 ×1
winapi ×1
x86 ×1