用C#/.NET挑战一下VFP

Foxer 2009-01-10 01:21:18
加精
我发现在这里有很多VFP爱好者见不得一点儿VFP的"坏话",我的分数也没什么用处,就出200分挑战一下VFP,看看C#/.NET与VFP对抗一下,各自优劣在哪里。
目的:让VFP爱好者/程序员更清晰的认识VFP的优点和劣势,而不是对其过于迷信。
范围:不限,但不要故意刁难。
方式:一段VFP代码对一段C#代码。

个人观点:C#/.NET强大,VFP简易快捷。

我是一个老Fox程序员了,对FoxBase/FoxPro/VFP了解的比较透彻,但C#/.NET方面只做了不到2年,算是比入门水平高一点的样子,不过在VFP能做到的功能,我用C#在.NET上基本都能实现或者基本都了解如何实现。

不是吵架贴,也不是比较谁好谁坏,所以不要在这里做这种评价了。
...全文
4117 147 打赏 收藏 转发到动态 举报
写回复
用AI写文章
147 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbl518 2009-01-18
  • 打赏
  • 举报
回复
用 0.000 秒 完成模糊查找!
Foxer 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 130 楼 cbl518 的回复:]
Foxer 老师你误解了,我不是讲《将注册表导出文本》
我是说:

C# VFP
插入记录:00:00:00.0296914 0.591
模糊查找1:00:00:00.4837845 0.933
模糊查找2:00:00:10.2512382 3.095

现在 vfp 用 3 秒 可以完成模糊查找!
我的方法用 不到一秒 完成模糊查找!

我还可以用 0 秒 完成模糊查找!

你信吗???
[/Quote]

有点怀疑,指教一下?
Foxer 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 128 楼 cbl518 的回复:]
微软收购了 vfp ,他为了其它几款软件的销路,放弃了vfp

所以,vfp 的奥妙和特点,微软没有声明!

但是它确实是存在的!

vfp 表面上的那些功能并不强大。也没有什么太特殊的地方。
当你研究到它的深奥处,那vfp的功能就会是你震撼~!!!

我使用它20多年了,我日日夜夜为它流血流汗,
同时为企业开发出了各种各样的应用软件,
但到现在我还是一知半解,不得其精髓!
真是太悲哀了!

C# 并不像微软宣…
[/Quote]

看C# 4.0和.NET 4.0吧,Foxer们不适应的地方会越来越少了。
就我目前所知,.NET 2.0才是真正的.NET,.NET 4.0才是真正的.NET 2.0。

.NET 1.0、1.1纯属探路的,.NET 3.0、3.5、3.5 SP1是Beta的,和Vista一样。
cbl518 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 127 楼 Foxer 的回复:]

TRANSFORM(SECONDS()-t)=0 只能是你在已经将注册表导出文本,并且已经读入内存的前提下完成。

[/Quote]

Foxer 老师你误解了,我不是讲《将注册表导出文本》
我是说:

C# VFP
插入记录:00:00:00.0296914 0.591
模糊查找1:00:00:00.4837845 0.933
模糊查找2:00:00:10.2512382 3.095

现在 vfp 用 3 秒 可以完成模糊查找!
我的方法用 不到一秒 完成模糊查找!

我还可以用 0 秒 完成模糊查找!

你信吗???
Foxer 2009-01-18
  • 打赏
  • 举报
回复
由于.NET中的字符串处理比VFP的要复杂的多,而且用.NET的时候,一般不大可能用带有StringComparison.Ordinal(相当于VFP的Machine)的IndexOf,所以在.NET中做这种操作是比较慢的。
这种操作在一般的软件里使用也很少,但是在我们系统里,刚好对大文本使用IndexOf的机会很多,从这段比较里,我也学到.NET里得IndexOf的效率还可以有很大提高的空间(某些情况下可达20倍)。

对于.NET中大量字符串连接操作,请使用StringBuilder,数量越大,StringBuilder提高的越多,就这里的这段代码就可能差几十倍。

另外:
for (int j = 1; j <= 50 * 1024 / 4; j++)
{
S=S+"狐狸";
}
从语法上可以写成:
for (int j = 1; j <= 50 * 1024 / 4; j++) S += "狐狸";

测试一下代码:

Stopwatch sw = new Stopwatch();

sw.Start();
string s = "";
for (int j = 1; j <= 50 * 512; j++) s += "狐狸";
sw.Stop();
Console.WriteLine("字符串连接1:{0}", sw.Elapsed);
sw.Reset();

sw.Start();
StringBuilder sb1 = new StringBuilder(50 * 512);
for (int i = 0; i < 50 * 512; i++) sb.Append("狐狸"); // 50K
string s2 = sb.ToString();
sw.Stop();
Console.WriteLine("字符串连接2:{0}", sw.Elapsed);
sw.Reset();

在我的机器上,第一种方法需要1.1秒左右,而第二种方法只需要不到0.001秒
cbl518 2009-01-18
  • 打赏
  • 举报
回复
微软收购了 vfp ,他为了其它几款软件的销路,放弃了vfp

所以,vfp 的奥妙和特点,微软没有声明!

但是它确实是存在的!

vfp 表面上的那些功能并不强大。也没有什么太特殊的地方。
当你研究到它的深奥处,那vfp的功能就会是你震撼~!!!

我使用它20多年了,我日日夜夜为它流血流汗,
同时为企业开发出了各种各样的应用软件,
但到现在我还是一知半解,不得其精髓!
真是太悲哀了!

C# 并不像微软宣传那样好!
它还在开发中,其各方面还在完善中,我不愿意给微软当实验员,所以我对它没做什么太深的研究!

何况企业开发的人、财、物、技术、产、供、销等…… 管理软件,vfp 已足够用的了!

学 vfp 就必须会用 api 和操作系统的脚本命令,
要想使你的应用程序可靠的运行,必须使用这些命令,监视系统的状况。
联网共享数据,更离不开这些命令!

使用 MS SQL 已经不适合当前信息的需要了!
这随着时间的延长,各位就明白了!

好了,我还要打夜班,有时间和各位老师网友再好好聊聊!
感谢 Foxer 老师提出这个课题,使我得到不少使用 C# 的信息。省的以后走弯路!
万分感谢!

当我认为 C# 已经成熟了,我还是要用它的!
它毕竟是新身事物啊!
Foxer 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 123 楼 lj_lt 的回复:]
SP1 补丁打过了
看电影?
等不了
c# VFP
插入记录: 00:00:06.8950275 2.950
不建索引模糊查找: 00:00:17.8991195 9.774
[/Quote]

.NET代码

StringBuilder sb = new StringBuilder();
Stopwatch sw = new Stopwatch();

//.NET中汉字与英文字母同样是一个字符,所以只要计算字符的个数就可以
for (int i = 0; i < 50 * 512; i++) sb.Append("狐狸"); // 50K

string notes = sb.ToString();
sb.Length = 0;

sw.Start();
DataTable dt = new DataTable("Test");
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("notes", typeof(string));

sw.Start();
object[] rowValues = new object[2];
dt.BeginLoadData();
for (int i = 1; i <= 10000; i++)
{
rowValues[0] = i;
rowValues[1] = notes;
dt.LoadDataRow(rowValues, true);
}
dt.EndLoadData();
sw.Stop();
Console.WriteLine("插入记录:{0}", sw.Elapsed);
sb.AppendFormat("插入记录:{0}\r\n", sw.Elapsed);
sw.Reset();

sw.Start();
var test = dt.AsEnumerable();
var dt1000 = from row in test where (row.Field<string>("notes").IndexOf("1000", StringComparison.Ordinal) >= 0) select row;
DataView dv3 = dt1000.AsDataView();
sw.Stop();
Console.WriteLine("模糊查找1:{0}", sw.Elapsed);
sb.AppendFormat("模糊查找1:{0}\r\n", sw.Elapsed);
sw.Reset();

sw.Start();
DataRow[] dr3 = dt.Select("notes like '%1000%'");
sw.Stop();
Console.WriteLine("模糊查找2:{0}", sw.Elapsed);
sb.AppendFormat("模糊查找2:{0}\r\n", sw.Elapsed);
sw.Reset();

Clipboard.SetText(sb.ToString());


VFP 代码

CLEAR

m.notes=REPLICATE("狐狸",50*1024/4) && 50K大小
CREATE CURSOR t1 ( id i ,notes M NOCPTRANS )

t=SECONDS()
FOR i=1 to 10000
INSERT INTO t1 VALUES ( i,m.notes+TRANSFORM(i))
ENDFOR
?'插入记录:'+TRANSFORM(SECONDS()-t)

t=SECONDS()
SELECT * FROM t1 WHERE AT('1000',notes)>0 INTO CURSOR t3
?'模糊查找1:'+TRANSFORM(SECONDS()-t)

t=SECONDS()
SELECT * FROM t1 WHERE notes like '%1000%' INTO CURSOR t3
?'模糊查找2:'+TRANSFORM(SECONDS()-t)
RETURN


比较结果

C# VFP
插入记录:00:00:00.0296914 0.591
模糊查找1:00:00:00.4837845 0.933
模糊查找2:00:00:10.2512382 3.095

.NET中的IndexOf默认情况下是使用带有区域信息的比较,所以速度很慢,这就是IndexOf后面要加StringComparison.Ordinal的原因。如果不加这个参数,查找1的时间与查找2的基本一样。
同时加入了cbl518的办法,VFP的速度提高了3倍多一点,很有效。


[Quote=引用 126 楼 cbl518 的回复:]
Foxer 老师,你太自信了!

你相信我可以用以上的实例,在:

?'模糊查找:'+TRANSFORM(SECONDS()-t) 显示为 0 的状况下。

查询出结果来吗?
[/Quote]
不是我自信(你的意思不是自大吧?),注册表操作是一个比较慢的操作,并且是树形目录,遍历查询一次几秒钟是做不到的。

TRANSFORM(SECONDS()-t)=0 只能是你在已经将注册表导出文本,并且已经读入内存的前提下完成。

看一下前面的比较结果,我相信C#在这个操作上不比VFP慢,这个自信还是有的。
Foxer 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 138 楼 lj_lt 的回复:]
贵族干不过乞丐

世界衰了
[/Quote]
那要看干什么了。
处理Unicode字符,做多线程,支持64bit这些现代程序最基本的要求VFP都做不到了。
何况还有数据加密、图形、多媒体、邮件等等。

其实VFP最致命的还不在这里,最致命的在于,"贵族"正当年,而"乞丐"后继无人啊!
Foxer 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 136 楼 lj_lt 的回复:]
to foxer老师:
你的代码里 没有
rowValues[1] = notes+i.ToString();

没有这个以后的模糊查询将会减少很多比较,应为没有'10000'
我加了这个这句

用你最新的代码测试运行测试

在我的内存只有1.5G的笔记本上跑出这样的结果 ,晕

插入记录:00:00:26.3444379
模糊查找1:00:05:05.7150067(好长时间啊)
模糊查找2:没有耐心再等下去


砸毁事?
[/Quote]

我没有注意到那个+,新程序改一下。
性能有所改变,不过用IndexOf的性能基本没有变化,但插入记录的时间增长了一倍(主要是字符串连接的性能低),DataView的查询方式时间增长了4倍。


插入记录 模糊查找
00.8216379 00.4691988
00.8567789 00.4747461
01.1526681 00.6391667
00.7986281 00.4694257
00.7890354 00.4705437
01.3679689 00.6001180
01.0250378 00.4763646
00.7919688 00.4714570
00.7969278 00.4682359

你的程序执行速度慢,我觉得是内存不够的原因,Vista对机器的要求就够高了,再运行你的程序,肯定要使用硬盘交换数据,这是已经不是在考验VFP或C#的性能了,而是看你的硬盘快不快了。
lj_lt 2009-01-18
  • 打赏
  • 举报
回复
贵族干不过乞丐

世界衰了
lj_lt 2009-01-18
  • 打赏
  • 举报
回复
cbl518 老师:

这么多的文本模糊查询需要0.000,秒
VFP有这么猛男吗 ?


光插入sql server 我化了10分钟,而且在事务里

在sql server 里运行这一句 SELECT * FROM t1 WHERE notes like '%1000%'
更不提了,你把电脑砸了吧

真是的,这世界是怎么回事情啊?

lj_lt 2009-01-18
  • 打赏
  • 举报
回复
to foxer老师:
你的代码里 没有
rowValues[1] = notes+i.ToString();

没有这个以后的模糊查询将会减少很多比较,应为没有'10000'
我加了这个这句

用你最新的代码测试运行测试

在我的内存只有1.5G的笔记本上跑出这样的结果 ,晕

插入记录:00:00:26.3444379
模糊查找1:00:05:05.7150067(好长时间啊)
模糊查找2:没有耐心再等下去


砸毁事?
atclub123 2009-01-18
  • 打赏
  • 举报
回复
谢谢 值得学习
lunhui3344 2009-01-18
  • 打赏
  • 举报
回复
学习................
Foxer 2009-01-18
  • 打赏
  • 举报
回复
本贴转到:
http://topic.csdn.net/u/20090118/21/443d4a20-45ff-4d7d-b02e-e35288ac2e85.html

继续,这里已经太长了。
coolyylu 2009-01-18
  • 打赏
  • 举报
回复
vcx ,scx都可以转换成prg发布.

记得有国外的foxer开发vss的插件.
源码管理器插件也支持将vcx,scx等双文件转换成单文件放置源码管理器中管理.

以前用starteam的时候,因为双文件,所以签入的时候就要比较小心.担心怕漏签入一个,下次签出的时候就麻烦了.

vfp的项目管理器中有文件checkin ,checkout的事件处理.自己弄也行的吧.


Foxer 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 141 楼 lj_lt 的回复:]
首先我做的产品不需要迈向国际,暂时不需要Unicode
象VFP那样,做一个多语言版本,VFP也是可以的
何况支持unicode 的activex,全套的我就用,只要把基类全部更换,保持统一的接口,现有程序不要修改,基本就能,我试过。


多线程那种效果未必VFP不可以,我现在做的每一个查询用户都可以选择后台运行,不影响前台操作,运行完自动通知程序显示


支持64bit,不知道性能能提高多少,你现在安装的是64位的系统吗?没有你就安装…
[/Quote]

不迈向国际的的产品不见得不需要Unicode,国内就有维文、藏文、蒙古文等等很多文字。而有很多产品因为客户的内容需要输入国外文字,此时不是换一个多语言版本就可以解决的,难道因为我的客户管理的信息中有韩文文字,我的整个产品界面都换成韩文的?不现实。
VFP对Unicode的支持很麻烦的,也不是换用外部的Unicode ActiveX就能解决的,比如你怎么保存Unicode字符,如何查询,查询到CURSOR里面它们又变成什么了?

多线程不是光是一个查询那么简单的事。我们有一个需求,就是用户输入一个查询字,我们要在互联网上的很多地方进行查询检索(本系统内的SQL查询、获取互联网上的Web页面并分析和提取数据或者用某种协议向支持这种协议的服务器查询(可能收费也可能不收费)等多种程序),检索到数据以后,就在界面上的某个列表里将其显示出来,这其中是很多个线程自己在做事,然后再将结果通过一个DataContext合并起来。另外,界面的更新使用多线程执行,会让你的代码更有效率。

64bit支持目前还看不到有多少性能提升,这个我很早就知道,甚至某些程序还可能会下降,另外,大多数系统并不需要64bit,但是眼看着4G、8G就要普及了,64bit就在眼前。我想64bit软件在64bit系统上运行起来是不是效果会更好?而且大内存的利用也会让你的系统更上层楼。
我现在用的就是Windows Server 2008 x64标准版,8G内存,因此,我在这里测试的.NET代码的也是以64bit运行的。

我不知道你对数据加密是怎么理解的。我在本地保存一个数据库的连接信息,不能保存明码吧?那我用什么加密?自己写吗?至少应该是DES,再好一点是3DES,我们现在用的是AES 256位加密。用户登录密码呢?用MD5吗?应该知道现在MD5已经不安全了。我们用SHA1,但现在SHA1也已经有人让其破解难度降低了2^17倍(280->263)。你的外部组件都有什么加密方法?我说的这些都是在.NET 1.0时代就支持的了。

VFP的GDI+用起来还可以,但是未来的界面是什么?一定是WPF,GDI+的替代者。有兴趣可以大概了解一下,看看WPF有多简单,同时也会看到它有多复杂。

并不是做邮件系统,收发邮件本来是一个很简单的事,但要在VFP里实现只能依赖于外部程序。除了邮件,还有HTTP、FTP等。

VFP调用外部程序,当然是能实现很多很多它没有的功能,但这么比意义就不大了。我曾经给客户用VFP做了一个程序,其中就嵌入了.NET程序,而且是带界面的,这么比较,VFP岂不是比.NET还强大了?(WPF程序一样可以嵌入VFP内使用)
lj_lt 2009-01-18
  • 打赏
  • 举报
回复
贵族和它的粉丝们在IT世界里闹腾
乞丐在晒太阳
lj_lt 2009-01-18
  • 打赏
  • 举报
回复
你说vcx麻烦,麻烦在哪里

说出来大家一起想办法
好否?
lj_lt 2009-01-18
  • 打赏
  • 举报
回复
首先我做的产品不需要迈向国际,暂时不需要Unicode
象VFP那样,做一个多语言版本,VFP也是可以的
何况支持unicode 的activex,全套的我就用,只要把基类全部更换,保持统一的接口,现有程序不要修改,基本就能,我试过。


多线程那种效果未必VFP不可以,我现在做的每一个查询用户都可以选择后台运行,不影响前台操作,运行完自动通知程序显示


支持64bit,不知道性能能提高多少,你现在安装的是64位的系统吗?没有你就安装一下看看,把这个测试代码在64位上运行一下,看看能快多少?
你还可以在网上搜一下32bit和64bit性能对比的文章

sql server ,Oracle 支持64位就可以呢,VFP能做到调用它们就行了,和本地快速的DBF结合起来使用,那才是最佳的。

数据加密、图形、多媒体、邮件

数据加密?
调用一个组件加密一下内容,这个难?

图形?
VFP的GDI+作的一个foxchart,VFPx的项目,已经完成,你可以看看去,感觉一下可以做到啥样的程度。

邮件系统?
作服务端吗,现成的免费的那么多,有多大必要再重写一个?

还是作收发邮件程序?
如果是这个化,VFP例子别太多。


不要把.net 当宗教
都是混饭吃的工具
没有必要的


加载更多回复(122)

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧